Annexe D — Bonnes pratiques et style C moderne
Style de code
Nommage
// Variables et fonctions : snake_case
int nombre_elements;
void calculer_moyenne(float *tableau, int taille);
// Constantes et macros : MAJUSCULES
#define MAX_TAILLE 100
const int VITESSE_LUMIERE = 299792458;
// Types (typedef) : PascalCase
typedef struct {
char nom[50];
int age;
} Etudiant;
Indentation et accolades
// Style recommandé : accolade sur la même ligne
if (condition) {
instruction();
} else {
autre_instruction();
}
// Toujours utiliser des accolades, même pour une seule instruction
if (x > 0) {
printf("positif\n"); // jamais sans accolades
}
Sécurité
Éviter les dépassements de tampon
// Mauvais
char buf[10];
scanf("%s", buf); // dangereux !
strcpy(dst, src); // dangereux !
// Bien
char buf[10];
scanf("%9s", buf); // limite la saisie
strncpy(dst, src, sizeof(dst) - 1);
dst[sizeof(dst) - 1] = '\0';
// Encore mieux (C11)
fgets(buf, sizeof(buf), stdin);
Valider les retours de fonctions
FILE *f = fopen("fichier.txt", "r");
if (f == NULL) {
perror("Erreur d'ouverture");
return EXIT_FAILURE;
}
void *ptr = malloc(1024);
if (ptr == NULL) {
fprintf(stderr, "Allocation échouée\n");
return EXIT_FAILURE;
}
Portabilité
// Utiliser stdint.h pour des tailles garanties
#include <stdint.h>
int32_t entier_32bits;
uint64_t entier_non_signe_64bits;
int8_t octet_signe;
// Utiliser size_t pour les tailles et indices
size_t longueur = strlen(chaine);
for (size_t i = 0; i < longueur; i++) { ... }
Idiomes C modernes (C99/C11)
// Déclaration dans le for
for (int i = 0; i < n; i++) { ... }
// Initialisation de structure par membre
Etudiant e = { .nom = "Alice", .age = 20 };
// Variable length arrays (VLA) — C99
void traiter(int n, int tableau[n]) { ... }
// bool natif — C99
#include <stdbool.h>
bool actif = true;
Checklist avant de soumettre du code