Препроцессор
Материал из cppreference.com
< cpp
Препроцессор выполняется во время выполнения фазы трансляции 4, перед компиляцией. Результатом препроцессинга является единственный файл, который затем передаётся фактическому компилятору.
Содержание |
[править] Директивы
Препроцессинговые директивы управляют поведением препроцессора. Каждая директива занимает одну строку и имеет следующий формат:
- символ #
- последовательность:
- стандартное имя директивы (перечисленные ниже), за которым следуют соответствующие аргументы, или
- один или несколько токенов предварительной обработки, где начальный токен не является стандартным именем директивы, в этом случае директива поддерживается условно с семантикой, определяемой реализацией (например, общее нестандартное расширение это директива #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++:
Номер | Применён | Поведение в стандарте | Корректное поведение |
---|---|---|---|
CWG 2001 | C++98 | поведение при использовании нестандартно определённых директив было неясным |
сделано условно поддерживаемым |
[править] Смотрите также
Документация C++ по Предопределённые Макро Символы
| |
Документация C++ по Указатель Макро Символов
| |
Документация C по препроцессора
|