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.
Sintaxis
#if expresión
|
|||||||||
#ifdef identificador
|
|||||||||
#ifndef identificador
|
|||||||||
#elif expresión
|
|||||||||
#else
|
|||||||||
#endif
|
|||||||||
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.
Evaluación condicional
#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) |
#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.
Ejemplo
#define ABCD 2
#include <stdio.h>
int main(void)
{
#ifdef ABCD
printf("1: si\n");
#else
printf("1: no\n");
#endif
#ifndef ABCD
printf("2: no1\n");
#elif ABCD == 2
printf("2: si\n");
#else
printf("2: no2\n");
#endif
#if !defined(DCBA) && (ABCD < 2*4-3)
printf("3: si\n");
#endif
}
Salida:
1: si
2: si
3: si
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
Véase también
Documentación de C++ para Inclusion condicional
|