Diretivas #if, #elif, #else e #endif

Diretivas de pré-processador que controlam a compilação de partes de um arquivo de origem.

#if ifCondition ...
[#elif elifCondition ...]
[#else ...]
#endif

Parâmetros

Item Descrição
ifCondition
Condição primária a ser avaliada. Se esse parâmetro for avaliado como um valor diferente de zero, todo o texto entre essa diretiva #if e a próxima instância da diretiva #elif, #else ou #endif será mantido na unidade de tradução; caso contrário, o código-fonte subsequente não será retido.
A condição pode usar o operador de pré-processador definido para determinar se uma constante ou macro de pré-processador específico está definida; esse uso é equivalente ao uso da diretiva #ifdef .
Consulte a seção Comentários para obter restrições sobre o valor do parâmetro ifCondition .
elifCondition [opcional]
Outra condição a ser avaliada. Se o parâmetro ifCondition e todas as diretivas #elif anteriores forem avaliados como zero e esse parâmetro for avaliado como um valor diferente de zero, todo o texto entre essa diretiva #elif e a próxima instância da diretiva #elif, #else ou #endif será mantido na unidade de tradução; caso contrário, o código-fonte subsequente não será retido.
A condição pode usar o operador de pré-processador definido para determinar se uma constante ou macro de pré-processador específico está definida; esse uso é equivalente ao uso da diretiva #ifdef .
Consulte a seção Comentários para obter restrições sobre o valor do parâmetro elifCondition .

Comentários

Cada diretiva #if em um arquivo de origem deve ser correspondida pela diretiva de fechamento #endif. Qualquer número de diretivas #elif pode aparecer entre as diretivas #if e #endif, mas no máximo uma diretiva #else é permitida. A diretiva #else, se presente, deve ser a última diretiva antes de #endif. As diretivas de compilação condicional contidas em arquivos de inclusão devem atender às mesmas condições.

As diretivas #if, #elif, #else e #endif podem se aninhar nas partes de texto de outras diretivas #if. Cada diretiva aninhada #else, #elif ou #endif pertence à diretiva #if anterior mais próxima.

Se nenhuma condição for avaliada como um valor diferente de zero, o pré-processador selecionará o bloco de texto após a diretiva #else. Se a cláusula #else for omitida e nenhuma condição for avaliada como um valor diferente de zero, nenhum bloco de texto será selecionado.

Os parâmetros ifCondition e elifCondition atendem muito aos seguintes requisitos:

  • As expressões de compilação condicional são tratadas como valores longos assinados e essas expressões são avaliadas usando as mesmas regras que as expressões em C++.
  • As expressões devem ter o tipo integral e podem incluir apenas constantes de inteiros, constantes de caracteres e o operador defined.
  • As expressões não podem usar sizeof ou um operador de conversão de tipo.
  • O ambiente de destino talvez não consiga representar todos os intervalos de inteiros.
  • A tradução representa o tipo int igual ao tipo long e unsigned int igual ao long sem sinal.
  • O tradutor pode traduzir a constante de caracteres como um conjunto de valores de código diferentes do conjunto para o ambiente de destino. Para determinar as propriedades do ambiente de destino, verifique os valores das macros de LIMITS.H em um aplicativo compilado para o ambiente de destino.
  • A expressão não deve executar consultas ambientais e deve permanecer isolada de detalhes da implementação no computador de destino.

Exemplos

Esta seção contém exemplos que demonstram como usar diretivas de pré-processador de compilação condicional.

Uso do operador definido

O exemplo a seguir mostra o uso do operador definido. Se o identificador CREDIT for definido, a chamada para a função de crédito será compilada. Se o identificador DEBIT for definido, a chamada para a função de débito será compilada. Se nenhum identificador for definido, a chamada para a função printerror será compilada. Observe que "CREDIT" e "credit" são identificadores distintos em C e C++ porque seus casos são diferentes.

#if defined(CREDIT)
    credit();
#elif defined(DEBIT)
    debit();
#else
    printerror();
#endif

Uso de diretivas de #if aninhadas

O exemplo a seguir mostra como aninhar diretivas de #if. Este exemplo pressupõe que uma constante simbólica chamada DLEVEL foi definida anteriormente. As diretivas #elif e #else são usadas para fazer uma das quatro opções, com base no valor de DLEVEL. A constante STACK é definida como 0, 100 ou 200, dependendo da definição de DLEVEL. Se DLEVEL for maior que 5, STACK não será definido.

#if DLEVEL > 5
    #define SIGNAL  1
    #if STACKUSE == 1
        #define STACK   200
    #else
        #define STACK   100
    #endif
#else
    #define SIGNAL  0
    #if STACKUSE == 1
        #define STACK   100
    #else
        #define STACK   50
    #endif
#endif
#if DLEVEL == 0
    #define STACK 0
#elif DLEVEL == 1
    #define STACK 100
#elif DLEVEL > 5
    display( debugptr );
#else
    #define STACK 200
#endif

Usar para incluir arquivos de cabeçalho

A compilação condicional é usada normalmente para evitar várias inclusões do mesmo arquivo de cabeçalho. No C++, onde as classes geralmente são definidas em arquivos de cabeçalho, constructos de compilação condicional podem ser usados para evitar várias definições. O exemplo a seguir determina se a constante simbólica EXAMPLE_H está definida. Nesse caso, o arquivo já foi incluído e não precisa ser reprocessado; caso contrário, a constante EXAMPLE_H é definida para indicar esse EXEMPLO. H já foi processado.

#if !defined( EXAMPLE_H )
#define EXAMPLE_H

class Example
{
...
};

#endif // !defined( EXAMPLE_H )

Confira também

Diretivas de pré-processador (DirectX HLSL)