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

