Espacios de nombres
Variantes
Acciones

Compilación condicional de código

De cppreference.com
 
 
Lenguaje C++
Temas generales
Control de flujo
Instrucciones de ejecución condicionales
Instrucciones de iteración (bucles)
Declaraciones de salto
Funciones
Declaración de funciones
Declaración de funciones lambda
Especificador inline
Especificación de excepciones (hasta C++20)
Especificador noexcept (C++11)
Excepciones
Espacios de nombres
Tipos
Especificadores
decltype (C++11)
auto (C++11)
alignas (C++11)
Especificadores de duración de almacenamiento
Inicialización
Expresiones
Representaciones alternas
Literales
Booleanos - Enteros - De punto flotante
De carácter - De cadena - nullptr (C++11)
Definidos por el usuario (C++11)
Utilidades
Atributos (C++11)
Tipos
Declaración de typedef
Declaración de alias de tipo (C++11)
Conversiones
Conversiones implícitas - Conversiones explícitas
static_cast - dynamic_cast
const_cast - reinterpret_cast
Asignación de memoria
Clases
Propiedades de funciones específicas de la clase
Funciones miembro especiales
Plantillas
Misceláneos
 
 

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