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

Las directivas de compilación condicional permiten incluir y excluir fragmentos de código del proceso de compilación. Las directivas #ifdef y #ifndef marcan el inicio del fragmento de código que controlan. El fragmento termina con la directiva #endif . En el caso más sencillo, la sintaxis de #ifdef es la siguiente:

#ifdef macro_identifier
  statements
#endif

Si una macro con el identificador especificado se define arriba en el código utilizando #define, entonces este fragmento de código participará en la compilación. En caso contrario, se excluye. Además de las macros definidas en el código de la aplicación, el entorno proporciona un conjunto de constantes predefinidas; en concreto, los indicadores _RELEASE y _DEBUG (véase la sección Constantes predefinidas), cuyos nombres también pueden comprobarse en directivas de compilación condicional.

La forma extendida #ifdef permite especificar dos fragmentos de código: el primero se incluirá si el identificador de macro está definido, y el segundo si no lo está. Para ello, se inserta un separador de fragmentos #else entre #ifdef y #endif.

#ifdef macro_identifier
  statesments_true
#else
  statements_false
#endif

La directiva #ifndef funciona de forma similar, pero los fragmentos se incluyen y excluyen según la lógica inversa: si la macro especificada en el encabezado no está definida, se compila el primer fragmento, y si está definida, se compila el segundo fragmento.

Por ejemplo, dependiendo de la presencia de la sustitución de macro DEMO, podremos llamar o no a la función de cálculo de los números de Fibonacci.

#ifdef DEMO
   Print("Fibo is disabled in the demo");
#else
   FillFibo();
#endif

En este caso, si el modo DEMO está activado, en lugar de llamar a la función se mostraría un mensaje en el registro, pero como en el script Preprocessor.mq5 y en todos los archivos incluidos no hay ninguna definición DEMO #define, la compilación procede de acuerdo con la rama #else, es decir, la llamada a la función FillFibo entra en el archivo ejecutable ex5.

Las directivas pueden anidarse.

#ifdef _DEBUG
   Print("Debugging");
#else
   #ifdef _RELEASE
      Print("Normal run");
   #else
      Print("Undefined mode!");
   #endif
#endif