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 identificadordefinido
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 |