Preprocessor
El preprocesador se ejecuta en la fase de traducción 4 , antes de la compilación. El resultado del preprocesamiento es un único archivo que luego se pasa al compilador real.
Contenidos |
Directivas
Las directivas de preprocesamiento controlan el comportamiento del preprocesador. Cada directiva ocupa una línea y tiene el siguiente formato:
- el # carácter.
- una secuencia de:
-
- un nombre de directiva definido por el estándar (listado abajo ) seguido de los argumentos correspondientes, o
- uno o más preprocessing tokens donde el token inicial no es un nombre de directiva definido por el estándar, en este caso la directiva es condicionalmente-soportada con semántica definida por la implementación (por ejemplo, una extensión no estándar común es la directiva #warning que emite un mensaje definido por el usuario durante la compilación) (hasta C++23) , o
- nada, en este caso la directiva no tiene efecto.
- un salto de línea.
|
Las directivas de módulo e importación también son directivas de preprocesamiento. |
(desde C++20) |
Las directivas de preprocesamiento no deben provenir de la expansión de macros.
#define EMPTY EMPTY # include <file.h> // no es una directiva de preprocesamiento
Capacidades
El preprocesador tiene las capacidades de traducción de archivos fuente:
- compilar condicionalmente partes del archivo fuente (controlado por las directivas #if , #ifdef , #ifndef , #else , #elif , #elifdef , #elifndef (desde C++23) , y #endif ).
- reemplazar macros de texto mientras posiblemente concatena o cita identificadores (controlado por las directivas #define y #undef , y los operadores # y ## ).
- incluir otros archivos (controlado por la directiva #include y verificado con __has_include (desde C++17) ).
- causar un error o una advertencia (desde C++23) (controlado por la directiva #error o #warning respectivamente (desde C++23) ).
Los siguientes aspectos del preprocesador pueden ser controlados:
- comportamiento definido por la implementación (controlado por la directiva #pragma y el operador _Pragma (desde C++11) ). Además, algunos compiladores admiten (en diversos grados) el operador __pragma como una extensión no estándar .
- información de nombre de archivo y línea disponible para el preprocesador (controlado por la directiva #line ).
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| CWG 2001 | C++98 | el comportamiento al usar directivas no definidas por el estándar no estaba claro | se convirtió en soportado condicionalmente |
Véase también
|
C++ documentation
para
Predefined Macro Symbols
|
|
|
C++ documentation
para
Macro Symbol Index
|
|
|
C documentation
para
preprocessor
|