Compilation Conditionnelle (#ifdef, #ifndef, #else, #endif)

The preprocessor directives are used by the compiler to preprocess the source code before compiling it. The directive always begins with #, therefore the compiler prohibits using the symbol in names of variables, functions etc.

Each directive is described by a separate entry and is valid until the line break. You cannot use several directives in one entry. If the directive entry is too big, it can be broken into several lines using the '\' symbol. In this case, the next line is considered a continuation of the directive entry.

Les directives de compilation conditionnelle du préprocesseur permettent de compiler ou d'ignorer une partie du programme suivant une certaine condition.

Cette condition peut prendre l'une des formes suivantes.

#ifdef identifiant
   // le code situé ici est compilé si l'identifiant a été défini dans une directive #define du préprocesseur.
#endif

#ifndef identifiant
   // le code situé ici est compilé si l'identifiant n'est pas défini dans une directive #define du préprocesseur.
#endif

Toutes les directives de compilation conditionnelles peuvent être suivis par un certain nombre de lignes contenant peut être une directive #else et se terminant par #endif. Si la condition vérifiée est vraie, les lignes entre #else et #endif sont ignorées. Si la condition vérifiée est fausse, toutes les lignes entre les directives #ifdef/#ifndef et #else (ou #endif s'il n'y a pas de #else) sont ignorées.

Exemple :

#ifndef TestMode
   #define TestMode
#endif
//+------------------------------------------------------------------+
//| Fonction de lancement du programme                               |
//+------------------------------------------------------------------+
void OnStart()
  {
   #ifdef TestMode
      Print("Mode de test");
   #else
      Print("Mode normal");
   #endif
  }

Suivant le type du programme et le mode de compilation, les macros standards sont définies de la façon suivante :

La macro __MQL5__ est définie lors de la compilation d'un fichier *.mq5, la macro __MQL4__ est définie lors de la compilation d'un fichier *.mq4.
La macro _DEBUG est définie lors d'une compilation en mode debug.
La macro _RELEASE est définie lors d'une compilation en mode release.

Exemple :

//+------------------------------------------------------------------+
//| Fonction de lancement du programme                               |
//+------------------------------------------------------------------+
void OnStart()
  {
   #ifdef __MQL5__
      #ifdef _DEBUG
         Print("Hello de la part du compilateur MQL5 [DEBUG]");
      #else
        #ifdef _RELEASE
           Print("Hello de la part du compilateur MQL5 [RELEASE]");
        #endif
     #endif
   #else
      #ifdef __MQL4__
         #ifdef _DEBUG
           Print("Hello de la part du compilateur MQL4 [DEBUG]");
        #else
           #ifdef _RELEASE
              Print("Hello de la part du compilateur MQL4 [RELEASE]");
           #endif
        #endif
     #endif
   #endif
  }