Compilación condicional de código
El preprocesador soporta la compilación condicional de partes de un archivo fuente. Este comportamiento está controlado por las directivas #if
, #else
, #elif
, #ifdef
, #ifndef
y #endif
.
Contenido |
[editar] Sintaxis
#if expresión
|
|||||||||
#ifdef identificador
|
|||||||||
#ifndef identificador
|
|||||||||
#elif expresión
|
|||||||||
#else
|
|||||||||
#endif
|
|||||||||
[editar] Explicación
El bloque de preprocesamiento condicional comienza con la directiva #if
, #ifdef
o #ifndef
, luego opcionalmente se puede incluir cualquier número de directivas #elif
, luego opcionalmente se puede incluir como máximo una directiva #else
y termina con la directiva #endif
. Todos los bloques de preprocesamiento condicional interno se procesan por separado.
Cada una de las directivas #if
, #elif
, #else
, #ifdef
y #ifndef
controla un bloque de código hasta la primera directiva #elif
, #else
, #endif
que no pertenezca a ningún bloque de preprocesamiento condicional interno.
Las directivas #if
, #ifdef
y #ifndef
prueban la condición especificada (ver abajo), y si se evalúa como verdadera, compila el bloque de código controlado. En ese caso, se ignoran las directivas #else
y #elif
posteriores. De lo contrario, si la condición especificada se evalúa como falsa, se omite el bloque de código controlado y se procesa la siguiente directiva #else
o #elif
(si la hubiera). En el primer caso, el bloque de código controlado por la directiva #else
se compila incondicionalmente. En este último caso, la directiva #elif
actúa como si fuera una directiva #if
: comprueba la condición, compila u omite el bloque de código controlado en función del resultado, y en este último caso procesa las directivas #elif
y #else
posteriores. El bloque de preprocesamiento condicional se termina con la directiva #endif
.
[editar] Evaluación condicional
[editar] #if, #elif
La expresión es una expresión constante, usando sólo constantes e identificadores, definidos usando la directiva #define. Cualquier identificador, que no sea literal, no definido usando la directiva #define, se evalúa a 0.
La expresión puede contener operadores unarios en forma de identificador definido
o (identificador) definido
que devuelven 1 si el identificador fue definido usando la directiva
#define y 0 en caso contrario. Si la expresión se evalúa a un valor distinto de cero, el bloque de código controlado se incluye y se omite en caso contrario. Si algún identificador utilizado no es una constante, se sustituye por 0.
Nota: |
(hasta C11) |
[editar] #ifdef, #ifndef
Comprueba si el identificador fue definido usando la directiva #define.
El identificador #ifdef
es esencialmente equivalente al identificador #if definido
.
El identificador #ifndef
es esencialmente equivalente al identificador #if !definido
.
[editar] Ejemplo
Salida:
1: si 2: si 3: si
[editar] Referencias
- Standard C11 (ISO/IEC 9899:2011):
- 6.10.1 Conditional inclusion (p: 162-164)
- Standard C99 (ISO/IEC 9899:1999):
- 6.10.1 Conditional inclusion (p: 147-149)
- Standard C89/C90 (ISO/IEC 9899:1990):
- 3.8.1 Conditional inclusion
[editar] Véase también
Documentación de C++ para Inclusion condicional
|