Namespaces
Variants

Preprocessor

From cppreference.net
C++ language
General topics
Preprocessor
Comments
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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:

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