Compilación condicional (#ifdef, #ifndef, #else, #endif)

El compilador usa las directivas del preprocesador para procesar de manera preliminar el código fuente antes de proceder a su compilación. La directiva comienza siempre con el símbolo # (almohadilla), por este motivo, el compilador prohíbe utilizar este símbolo en los nombres de las variables, funciones, etcétera.

Cada directiva se describe con una entrada aparte y es válida hasta el salto de línea. No es posible usar varias directivas en una sola entrada. Si la entrada de la directiva es demasiado grande, podremos dividirla en varias líneas con la ayuda de la barra invertida '\', en este caso, la línea siguiente se considerará una continuación de la entrada de la directiva.

Las directivas de compilación condicional del preprocesador permiten compilar u omitir una parte del programa dependiendo del cumplimiento de una cierta condición.

Esta condición puede tomar una de las siguientes formas.

#ifdef identifier
   // el código ubicado aquí se compila si identifier ya ha sido definido para el preprocesador en la directiva #define.
#endif

#ifndef identifier
   // el código ubicado aquí se compila si identifier en este momento no está definido por la directiva del preprocesador #define.
#endif

Después de cualquier directiva de compilación condicional puede ir cualquier número de líneas que posiblemente contengan la directiva #else y se terminan con #endif. Si la condición a comprobar es cierta, las líneas entre #else y #endif se ignoran. Si la condición a comprobar no se cumple, se ignoran todas las líneas entre la comprobación y la directiva #else (si ésta no existe, entre la comprobación y la directiva #endif).

Ejemplo:

#ifndef TestMode
   #define TestMode
#endif
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   #ifdef TestMode
      Print("Test mode");
   #else
      Print("Normal mode");
   #endif
  }

En función del tipo del programa y el modo de compilación, las macros estándar se definen de la siguiente manera:

La macro __MQL5__  se define cuando se compila *.mq5, la macro __MQL4__ se define cuando se compila *.mq4.
La macro _DEBUG se define cuando se compila en modo de depuración.
La macro _RELEASE se define cuando se compila en modo de realización.

Ejemplo:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   #ifdef __MQL5__
      #ifdef _DEBUG
         Print("Hello from MQL5 compiler [DEBUG]");
      #else
        #ifdef _RELEASE
           Print("Hello from MQL5 compiler [RELEASE]");
        #endif
     #endif
   #else
      #ifdef __MQL4__
         #ifdef _DEBUG
           Print("Hello from MQL4 compiler [DEBUG]");
        #else
           #ifdef _RELEASE
              Print("Hello from MQL4 compiler [RELEASE]");
           #endif
        #endif
     #endif
   #endif
  }