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

Препроцессор выполняется на фазе трансляции 4 , перед компиляцией. Результатом препроцессинга является единый файл, который затем передается фактическому компилятору.

Содержание

Директивы

Директивы препроцессора управляют поведением препроцессора. Каждая директива занимает одну строку и имеет следующий формат:

  • символ # .
  • последовательность:
  • стандартное имя директивы (перечислено ниже ) с соответствующими аргументами, или
  • один или более preprocessing tokens , где начальный токен не является стандартным именем директивы, в этом случае директива условно-поддерживаемая с реализационно-определённой семантикой (например, распространённое нестандартное расширение - директива #warning , которая выводит пользовательское сообщение во время компиляции) (до C++23) , или
  • ничего, в этом случае директива не имеет эффекта.
  • перевод строки.

Директивы module и import также являются директивами препроцессора.

(начиная с C++20)

Директивы препроцессора не должны появляться из макрорасширения.

#define EMPTY
EMPTY   #   include <file.h> // не является директивой препроцессора

Возможности

Препроцессор обладает следующими возможностями трансляции исходного файла:

  • условно компилировать части исходного файла (управляется директивами #if , #ifdef , #ifndef , #else , #elif , #elifdef , #elifndef (начиная с C++23) , и #endif ).
  • заменять текстовые макросы с возможной конкатенацией или цитированием идентификаторов (управляется директивами #define и #undef , и операторами # и ## ).
  • включать другие файлы (управляется директивой #include и проверяется с помощью __has_include (начиная с C++17) ).
  • вызывать ошибку или предупреждение (начиная с C++23) (управляется директивой #error или #warning соответственно (начиная с C++23) ).

Следующие аспекты препроцессора могут быть контролируемы:

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены задним числом к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
CWG 2001 C++98 поведение при использовании нестандартных директив было неясным сделано условно поддерживаемым

Смотрите также

C++ documentation для Predefined Macro Symbols
C++ documentation для Macro Symbol Index
C documentation для preprocessor