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 )