Preprocessor
Препроцессор выполняется на фазе трансляции 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) ).
Следующие аспекты препроцессора могут быть контролируемы:
- поведение, определяемое реализацией (управляется директивами #pragma и оператором _Pragma (начиная с C++11) ). Кроме того, некоторые компиляторы поддерживают (в разной степени) оператор __pragma как нестандартное расширение.
- информация о имени файла и номере строки доступная препроцессору (управляется директивой #line ).
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены задним числом к ранее опубликованным стандартам 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
|