#if, #elif, #else, and #endif (Directivas)

Directivas de preprocesador que controlan la compilación de partes de un archivo de código fuente.

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

Parámetros

Elemento Descripción
ifCondition
Condición principal que se va a evaluar. Si este parámetro se evalúa como un valor distinto de cero, todo el texto entre esta directiva #if y la siguiente instancia de la #elif, #else o #endif directiva se conserva en la unidad de traducción; de lo contrario, no se conserva el código fuente posterior.
La condición puede usar el operador de preprocesador definido para determinar si se define una constante o macro de preprocesador específica; este uso es equivalente al uso de la directiva #ifdef .
Consulte la sección Comentarios para obtener restricciones sobre el valor del parámetro ifCondition .
elifCondition [optional]
Otra condición que se va a evaluar. Si el parámetro ifCondition y todas las directivas de #elif anteriores se evalúan como cero, y este parámetro se evalúa como un valor distinto de cero, todo el texto entre esta directiva de #elif y la siguiente instancia de la #elif, #else o #endif directiva se conserva en la unidad de traducción; de lo contrario, no se conserva el código fuente posterior.
La condición puede usar el operador de preprocesador definido para determinar si se define una constante o macro de preprocesador específica; este uso es equivalente al uso de la directiva #ifdef .
Consulte la sección Comentarios para obtener restricciones sobre el valor del parámetro elifCondition .

Observaciones

Cada directiva #if de un archivo de origen debe coincidir con una directiva #endif de cierre. Cualquier número de directivas de #elif puede aparecer entre las directivas #if y #endif, pero se permite como máximo una directiva #else. La directiva #else, si está presente, debe ser la última directiva antes de #endif. Las directivas de compilación condicional contenidas en los archivos de inclusión deben cumplir las mismas condiciones.

Las directivas #if, #elif, #else y #endif pueden anidar en las partes de texto de otras directivas de #if. Cada directiva de #else anidada, #elif o #endif pertenece a la directiva de #if más cercana.

Si ninguna condición se evalúa como un valor distinto de cero, el preprocesador selecciona el bloque de texto después de la directiva #else. Si se omite la cláusula #else y no se evalúa ninguna condición como un valor distinto de cero, no se selecciona ningún bloque de texto.

Los parámetros ifCondition y elifCondition cumplen mucho los siguientes requisitos:

  • Las expresiones de compilación condicional se tratan como valores largos firmados y estas expresiones se evalúan con las mismas reglas que las expresiones en C++.
  • Las expresiones deben tener tipo entero y solo pueden incluir constantes de tipo entero, constantes de caracteres y el operador defined.
  • Las expresiones no pueden usar sizeof ni un operador de conversión de tipos.
  • Es posible que el entorno de destino no pueda representar todos los intervalos de enteros.
  • La traducción representa el tipo int igual que el tipo long y unsigned int igual que unsigned long.
  • El traductor puede traducir constantes de caracteres a un conjunto de valores de código diferentes del conjunto para el entorno de destino. Para determinar las propiedades del entorno de destino, compruebe los valores de las macros de LIMITS.H en una aplicación compilada para el entorno de destino.
  • La expresión no debe realizar ninguna consulta de ambiente y debe permanecer aislada de los detalles de implementación del equipo de destino.

Ejemplos

Esta sección contiene ejemplos que muestran cómo usar directivas de preprocesador de compilación condicional.

Uso del operador definido

En el ejemplo siguiente se muestra el uso del operador definido. Si se define el identificador CREDIT, se compila la llamada a la función de crédito . Si se define el identificador DEBIT, se compila la llamada a la función de débito . Si no se define ninguno de los identificadores, se compila la llamada a la función printerror . Tenga en cuenta que "CREDIT" y "credit" son identificadores distintos en C y C++ porque sus casos son diferentes.

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

Uso de directivas de #if anidadas

En el ejemplo siguiente se muestra cómo anidar directivas #if. En este ejemplo se supone que se ha definido previamente una constante simbólica denominada DLEVEL. Las directivas #elif y #else se usan para tomar una de las cuatro opciones, en función del valor de DLEVEL. La constante STACK se establece en 0, 100 o 200, en función de la definición de DLEVEL. Si DLEVEL es mayor que 5, no se define STACK.

#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

Uso para incluir archivos de encabezado

Un uso común para la compilación condicional es evitar inclusiones múltiples del mismo archivo de encabezado. En C++, donde las clases a menudo se definen en archivos de encabezado, las construcciones de compilación condicional se pueden usar para evitar varias definiciones. En el ejemplo siguiente se determina si se define la constante simbólica EXAMPLE_H. Si es así, el archivo ya se ha incluido y no es necesario volver a procesarlo; si no es así, la constante EXAMPLE_H se define para indicar ese EJEMPLO. H ya se ha procesado.

#if !defined( EXAMPLE_H )
#define EXAMPLE_H

class Example
{
...
};

#endif // !defined( EXAMPLE_H )

Vea también

Directivas de preprocesador (DirectX HLSL)