Aller au contenu

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

  • Compiler avec -Wall -Wextra sans avertissements
  • Tester avec Valgrind (--leak-check=full)
  • Vérifier tous les retours de malloc/fopen
  • S'assurer que chaque malloc a son free
  • Vérifier les bornes de tous les accès aux tableaux
  • Tester avec des valeurs limites (0, négatif, très grand)