Препроцессор
Материал из 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 по препроцессора |