Espacios de nombres
Variantes
Acciones

Compilación condicional de código

De cppreference.com
 
 
Lenguaje C++
Los temas generales
Original:
General topics
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Control de flujo
Original:
Flow control
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Sentencias condicionales ejecución
Original:
Conditional execution statements
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Instrucciones de iteración
Original:
Iteration statements
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Ir declaraciones
Original:
Jump statements
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Funciones
Original:
Functions
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
declaración de la función
lambda declaración de la función
función de plantilla
especificador inline
especificaciones de excepción (obsoleto)
noexcept especificador (C++11)
Excepciones
Original:
Exceptions
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Los espacios de nombres
Original:
Namespaces
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Tipos
Original:
Types
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
decltype specifier (C++11)
Los especificadores
Original:
Specifiers
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
cv especificadores
almacenamiento duración especificadores
constexpr especificador (C++11)
auto especificador (C++11)
alignas especificador (C++11)
Inicialización
Original:
Initialization
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Los literales
Original:
Literals
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Expresiones
Original:
Expressions
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
representaciones alternativas
Utilidades
Original:
Utilities
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Tipos
Original:
Types
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
typedef declaration
alias de tipo de declaración (C++11)
atributos (C++11)
Lanza
Original:
Casts
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
conversiones implícitas
const_cast conversion
static_cast conversion
dynamic_cast conversion
reinterpret_cast conversion
C-cast estilo y funcional
De asignación de memoria
Original:
Memory allocation
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Clases
Original:
Classes
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Clase propiedades específicas de la función
Original:
Class-specific function properties
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Funciones especiales miembro
Original:
Special member functions
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Plantillas
Original:
Templates
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
clase de plantilla
función de plantilla
plantilla de especialización
paquetes de parámetros (C++11)
Varios
Original:
Miscellaneous
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Montaje en línea
 
 

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