
Les directives #ifdef, #ifndef, #else, et #endif sont utilisées pour la compilation conditionnelle dans le langage C. Elles permettent d’inclure ou d’exclure certaines parties du code en fonction de conditions spécifiques. Cela peut être utile pour activer ou désactiver des sections de code selon des plateformes, des configurations de compilation, ou des environnements différents.
#ifdef (If Defined)La directive #ifdef permet de vérifier si une macro a été définie. Si la macro a été définie avant l’utilisation de #ifdef, le bloc de code entre #ifdef et #endif sera compilé. Si la macro n’est pas définie, le bloc de code est ignoré.
#define DEBUG // Définir la macro DEBUG
#ifdef DEBUG
printf("Mode débogage activé\n");
#endif
Dans cet exemple, puisque la macro DEBUG a été définie avant #ifdef, le code à l’intérieur de #ifdef sera exécuté. La sortie sera :
Mode débogage activé
Si la ligne #define DEBUG est supprimée, alors la ligne printf sera ignorée.
#ifndef (If Not Defined)La directive #ifndef est l’inverse de #ifdef. Elle permet de vérifier si une macro n’a pas été définie. Si la macro n’est pas définie avant #ifndef, le bloc de code sera compilé, sinon il sera ignoré.
#ifndef DEBUG
#define DEBUG 1 // Si DEBUG n'est pas déjà défini, le définir à 1
#endif
Ici, si la macro DEBUG n’était pas définie avant ce bloc, elle serait définie à 1. Si elle l’était déjà, le code à l’intérieur de #ifndef sera ignoré.
#elseLa directive #else permet de spécifier un bloc de code à exécuter si la condition de la directive #ifdef ou #ifndef est fausse (si la macro n’est pas définie dans le cas de #ifdef ou si elle est définie dans le cas de #ifndef).
#ifdef DEBUG
printf("Mode débogage activé\n");
#else
printf("Mode normal activé\n");
#endif
Dans cet exemple :
DEBUG est défini, le programme affiche « Mode débogage activé ».DEBUG n’est pas défini, le programme affiche « Mode normal activé ».#ifdef, #else, et #endifCes directives sont souvent utilisées ensemble pour gérer plusieurs configurations ou comportements dans le code en fonction des macros définies.
#ifdef DEBUG
printf("Mode débogage activé\n");
#else
printf("Mode normal activé\n");
#endif
#ifndef VERSION
#define VERSION "1.0"
#endif
printf("Version : %s\n", VERSION);
Dans cet exemple :
DEBUG est défini ou non.VERSION n’est pas déjà définie. Si elle l’est, la ligne #define VERSION "1.0" sera ignorée.#ifdef DEBUG
#define AFFICHER(x) Serial.print(x)
#else
#define AFFICHER
#endif
// Utilisation:
AFFICHER("Un message ...\n");
#define AFFICHER(...) Serial.print(__VA_ARGS__)
// Utilisation:
AFFICHER(255, HEX);
AFFICHER("Test");
#ifndef fichier_h #define fichier_h ... #endif // Il est aussi possible d'utiliser la directive suivante pour s'assurer que le fichier sera inclu q'une seule fois. #pragma once ... // Voici une autre utilisation de #pragma #pragma GCC poison sprintf // Produira une erreur à l'utilisation de la fonction sprintf(): Compiling .pio/build/uno/src/main.cpp.o src/main.cpp:18:3: error: attempt to use poisoned "sprintf" sprintf(buffer, "Yo");
Référence pour #pragma_once
#ifdef : Inclut un bloc de code si la macro est définie.#ifndef : Inclut un bloc de code si la macro n’est pas définie.#else : Permet de spécifier un bloc de code alternatif si la condition de #ifdef ou #ifndef est fausse.#endif : Termine un bloc de condition.Ces directives permettent une gestion très flexible du code, particulièrement utile pour les projets multi-plateformes, pour inclure/exclure des instructions de traçage ou lors de la gestion de différentes versions d’un même programme.