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

As diretivas do pré-processador são usadas ​​pelo do compilador para pré-processamento do código fonte antes de sua compilação. A diretiva sempre começa com o # (jogo da velha), por isso o compilador proíbe o uso deste símbolo nos nomes das variáveis, funções, etc.

Cada diretiva é descrita por um registro separado e opera antes da mudança de linha. Não se podem utilizar várias diretivas num só registro. Se o registro da diretiva for muito grande, ele pode ser dividido em várias linhas usando a barra invertida '\', neste caso, a próxima linha é considerada uma continuação do registro da diretiva.

As diretrizes de compilação condicional do pré-processador permitem compilar ou pular uma parte do programa dependendo do cumprimento de uma determinada condição.

Essa condição pode assumir uma das seguintes formas.

#ifdef identifier
   // O código aqui é compilado se o identificador já tiver sido definido para o pré-processador na diretriz #define.
#endif

#ifndef identifier
   // O código localizado aqui é compilado se o identificador não está definido atualmente pelo pré-processador da diretriz #define.
#endif

Qualquer uma das diretrizes de compilação condicional pode ser seguida por qualquer número de linhas possivelmente contendo a diretiva #else e terminando com #endif. Se a condição verificada for verdadeira, as linhas entre #else e #endif serão ignoradas. Se a condição verificada não for cumprida, todas as linhas entre a verificação e a diretiva #else (ou a diretiva #endif se a primeira estiver ausente) serão ignoradas.

Exemplo:

#ifndef TestMode
   #define TestMode
#endif
//+------------------------------------------------------------------+
//| Função de início do programa script                              |
//+------------------------------------------------------------------+
void OnStart()
  {
   #ifdef TestMode
      Print("Test mode");
   #else
      Print("Normal mode");
   #endif
  }

Dependendo do tipo de programa e do modo de compilação, os padrões macros são definidos da seguinte forma:

__MQL5__  macro é definido ao compilar o arquivo *.mq5, __MQL4__ macro é definido ao compilar o *.mq4.
_DEBUG macro é definido ao compilar o modo de depuração.
_RELEASE macro É definido ao compilar no modo de liberação.

Exemplo:

//+------------------------------------------------------------------+
//| Função de início do programa script                              |
//+------------------------------------------------------------------+
void OnStart()
  {
   #ifdef __MQL5__
      #ifdef _DEBUG
         Print("Olá do compilador MQL5 [DEBUG]");
      #else
        #ifdef _RELEASE
           Print("Olá do compilador MQL5 [RELEASE]");
        #endif
     #endif
   #else
      #ifdef __MQL4__
         #ifdef _DEBUG
           Print("Olá do compilador MQL4 [DEBUG]");
        #else
           #ifdef _RELEASE
              Print("Olá do compilador MQL4 [RELEASE]");
           #endif
        #endif
     #endif
   #endif
  }