Compilación condicional de código
El preprocesador permite la compilación condicional de algunas partes del archivo fuente. Este comportamiento está controlado por las directivas #if, #else, #elif, #ifdef, #ifndef y #endif.
Contenido |
[editar] Sintaxis
#if expresión
|
|||||||||
#elif expresión
|
|||||||||
#ifdef identificador
|
|||||||||
#ifndef identificador
|
|||||||||
#else
|
|||||||||
#endif
|
|||||||||
[editar] Explicación
Un bloque de preprocesamiento condicional comienza con la directiva #if, #ifdef o #ifndef, después, opcionalmente, se puede incluir cualquier número de directivas #elif, a continuación, opcionalmente, se incluye como mucho una directiva #else y se termina con la directiva de cierre #endif. Todos los bloques de preprocesamiento condicional interiores se procesan por separado .
Cada una de las directivas #if, #elif, #else, #ifdef y #ifndef abarca el bloque de código hasta la primera directiva #elif, #else o #endif que no pertenece a ningún bloque interno de preprocesamiento condicional.
Las directivas #if, #ifdef y #ifndef comprueban la condición especificada (ver abajo) y si se evalúa como verdadera, compila el bloque de código abarcado. En ese caso, las siguientes directivas #else y #elif se ignoran. De lo contrario, si la condición especificada se evalúa como falsa, el bloque de código abarcado se omite y la siguiente directiva #else o #elif (si las hay) se procesa. En el primer caso, el bloque de código abarcado por la directiva #else se compila incondicionalmente. En el último caso, la directiva #elif actúa como si se tratara de directiva #if: verifica que se cumpla la condición, compila u omite el bloque de código abarcado en función del resultado, y en el caso de resultado falso, se procesa las siguientes directivas #elif y #else. El bloque de preprocesamiento condicional se finaliza con la directiva #endif.
[editar] Evaluación de condición
[editar] #if, #elif
expression, es una expresión constante, utilizando sólo valores literales e identificadores, definidos mediante directiva #define. Cualquier identificador, que no sea literal, si no está definido con la directiva #define, se evalúa como 0 .
La expresión puede contener operadores unarios de la forma defined identificador o defined (identificador) que se evalua como 1 si el identificador fue creado utilizando la directiva #define y como 0 en el caso contrario. Si al evaluar la expresión se obtiene un resultado distinto de cero, el bloque de código interno se incluye en la compilación, y se elimina en el caso contrario. Cualquier identificador utilizado que no sea una constante se sustituye por 0.
[editar] #ifdef, #ifndef
Comprueba si el identificador se creó utilizando la directiva #define.
#ifdef identificador es equivalente a #if defined(identificador).
#ifndef identificador es equivalente a #if !defined(identificador).
[editar] Ejemplo
#define ABCD 2 #include <iostream> int main() { #ifdef ABCD std::cout << "1: si\n"; #else std::cout << "1: no\n"; #endif #ifndef ABCD std::cout << "2: no1\n"; #elif ABCD == 2 std::cout << "2: si\n"; #else std::cout << "2: no2\n"; #endif #if !defined(DCBA) && (ABCD < 2*4-3) std::cout << "3: si\n"; #endif }
Salida:
1: si 2: si 3: si