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

#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: #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 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

[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