Espacios de nombres
Variantes
Acciones

Compilación condicional de código

De cppreference.com

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

#ifexpresión
#ifdefidentificador
#ifndefidentificador
#elifexpresió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: #if cond1 ... #elif cond2 es diferente de #if cond1... #else seguido de #if cond3 porque si cond1 es verdadero, el segundo #if se salta y cond3 no necesita estar bien formado, mientras que la cond2 de #elif debe ser una expresión válida.

(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

#define ABCD 2#include <stdio.h>   int main(void){   #ifdef ABCDprintf("1: si\n");#elseprintf("1: no\n");#endif   #ifndef ABCDprintf("2: no1\n");#elif ABCD == 2printf("2: si\n");#elseprintf("2: no2\n");#endif   #if !defined(DCBA) && (ABCD < 2*4-3)printf("3: si\n");#endif}

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
close