#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 de #if y la siguiente instancia del #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 #elif y la siguiente instancia de la #elif, #else o directiva #endif 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 .

Comentarios

Cada directiva #if de un archivo de código fuente debe coincidir con una directiva #endif de cierre. Puede aparecer cualquier número de directivas #elif entre las directivas #if y #endif, pero como máximo se permite 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 include deben cumplir las mismas condiciones.

Las directivas #if, #elif, #else y #endif pueden anidar en las partes de texto de otras directivas #if. Cada directiva #else, #elif o #endif anidada pertenece a la directiva #if anterior 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 ninguna condición se evalúa 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 con signo y estas expresiones se evalúan con las mismas reglas que las expresiones de 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 ningún identificador, 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 de #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, según 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 suelen definirse en archivos de encabezado, se pueden usar construcciones de compilación condicionales 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 )

Consulte también

Directivas de preprocesador (DirectX HLSL)