-
Notifications
You must be signed in to change notification settings - Fork 2
Bad Coding Practices ( C language)
Ceci est une liste non exhaustive de mauvaises pratiques de programmation en langage C.
La norme ANSI-C (dite aussi norme C-89) est la norme recommandée.
En langage C (norme ANSI-C dite aussi C-89), il est interdit de déclarer le type du compteur dans la boucle for
.
Ceci est accepté dans le langage C++ (voire la norme C-99) et peut passer durant la compilation sur votre machine.
for (int i; i<10; i++){ //interdit en norme ANSI-C
Les variables doivent être déclarées en premier lieu avant d'être utilisées.
int n=100;
int Tab[n]; //interdit en C (norme ANSI-C)
/* la taille d'un tableau statique doit être connue depuis la phase de compilation;
une constante peut être utilisée également pour définir la capacité du tableau. */
int Tab[100];
En C, il n'existe pas de type booléen. L'utilisation de la bibliothèque <stdbool.h>
est permise en norme C-99.
Cependant, ceci est non conforme à la norme ANSI-C.
En C, une chaîne de caractères est déclarée en tant que tableau de caractères.
'\0'
.
// exemples avec initialisation
char ch1[] = "abcd"; // la taille du tableau sera = 5
// ou
char ch2[5] = "abcd"; // dernier caractère '\0'
// ou
char ch3[] = {'a', 'b', 'c', 'd', '\0'};
// exemple sans initialisation
char ch4[20]; // au maximum la longueur de la chaîne sera = 20
scanf("%s", ch4); // lit les caractères sur une ligne jusqu'à rencontre du premier espace (pareil pour lecture du fichier avec "fscanf")
gets(ch4); // lit la totalité de ligne; même si la ligne contient un ou plusieurs espaces (pareil pour lecture du fichier avec "fgets")
🚫 Le type string
est propre au langage C++ !
Eviter l'utilisation de getchar()
(attente de saisie d'un caractère pour sortir de la console) en fin du programme main.
Ceci conduit à une attente d'exécution sur le serveur PC^2 et à un dépassement de temps d'exécution permis (l'erreur "Time Limit Exceeded" sera envoyée).
Il faut délimiter les blocs (conditionnels et itératifs) avec des accolades; même si le bloc contient une seule instruction. Ignorer les accolades de ses blocs augmente le risque de présence de bug dans des futures mises à jour du code.
/* Ce code est fonctionnel (si les deux conditions contiennent une seule instruction).
Cependant, les bonnes pratiques de codage ne sont pas respectées! */
if(x==1)
printf("Bonjour!");
else
printf("Hello ");
printf("World!"); // Cette instruction n'est pas incluse dans else; elle sera exécutée en dehors du bloc conditionnel
/* Ce code est meilleur en terme de bonne pratique */
if(x==1){
printf("Bonjour!");
} else {
printf("Hello ");
printf("World!");
}
Un code non indenté est un code non lisible et difficile à déboguer.
ℹ️ L'IDE NetBeans inclue une fonctionnalité d'indentation automatique :
- Clic droit (avec la souris) dans l'éditeur du code source; puis
Format
; - OU raccourci clavier
alt
+shift
+F
.
L'utilisation de bibliothèques hors norme induit à avoir un code non portable qui ne peut pas être compilé sur d'autres systèmes.
La bibliothèque <conio.h>
est un exemple de bibliothèque compatible Windows et non compatible avec Linux.
Eviter l'utilisation des espaces et des caractères spéciaux dans les noms des fichiers sources.
Ceci conduit à une erreur de compilation sur le serveur PC^2 (l'erreur "Compilation Error" sera envoyée).