Leçon 53 : Directives de préprocesseur avancées (Compilation conditionnelle)
La compilation conditionnelle permet au programmeur d'inclure ou d'exclure des blocs de code spécifiques en fonction de conditions prédéfinies (macros). C'est crucial pour la portabilité, le débogage et la gestion de différentes configurations de build.
1. #ifdef et #ifndef
#ifdef identifiant: Vérifie si une macroidentifianta été définie.#ifndef identifiant: Vérifie si une macroidentifiantn'a pas été définie.
Exemple : Activation du débogage
c #include <stdio.h>
#define DEBUG // Définir DEBUG globalement (ex: via le drapeau du compilateur -DDEBUG)
int main() { int donnees = 42; printf("Programme en cours d'exécution.\n");
#ifdef DEBUG
// Ce code n'existe que si DEBUG est défini
printf("[DEBUG] La valeur des données est : %d\n", donnees);
#endif
printf("Programme terminé.\n");
return 0;
}
2. #if, #elif, et #else
Vérifie si une expression entière constante est vraie (non nulle).
c #define OS_TYPE 1 // 1 pour Linux, 2 pour Windows
#if OS_TYPE == 1 #include <unistd.h> #define NOM_SYSTEME "Linux" #elif OS_TYPE == 2 #include <windows.h> #define NOM_SYSTEME "Windows" #else #define NOM_SYSTEME "Inconnu" #endif
int main() { printf("Compilation pour %s\n", NOM_SYSTEME); return 0; }
3. Gardes d'en-tête (Header Guards)
La compilation conditionnelle est utilisée dans les fichiers d'en-tête pour garantir que leur contenu n'est inclus qu'une seule fois, évitant ainsi les erreurs de redéfinition.
c // Dans mon_en-tete.h #ifndef MON_EN_TETE_H #define MON_EN_TETE_H
// Contenu de l'en-tête
#endif // MON_EN_TETE_H