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