PDA

View Full Version : Compilação Condicional (#ifdef, #ifndef, #else, #endif)



jssuser
02-01-2019, 02:23 PM
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
}