Предпроцессор
Предпроцессор выполняется на четвёртой стадии трансляции перед компиляцией. Результатом работы предпроцессора является один файл, который затем передаётся в сам компилятор.
Директивы
Директивы предпроцессора управляют его поведением. Каждая директива занимает одну строку и имеет следующий формат:
- символ
#. - последовательность:
- имя стандартной директивы (перечислены ниже) с соответствующими аргументами, или
- одна или несколько токенов предпроцессора, где начальный токен не является именем стандартной директивы, в этом случае директива поддерживается условно с определённым реализацией поведением (например, распространённым нестандартным расширением является директива
#warning, которая выводит пользовательское сообщение во время компиляции)(до C++23), или - ничего, в этом случае директива не имеет эффекта.
- перевод строки.
| Директивы модулей и импорта также являются директивами предпроцессора. | (с C++20) |
Директивы предпроцессора не должны происходить от расширения макросов.
#define EMPTY EMPTY # include <file.h> // not a preprocessing directive
Возможности
Предпроцессор обладает возможностями трансляции исходного файла:
- условно компилировать части исходного файла (управляемые директивами
#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 | Применено к | Поведение, как опубликовано | Правильное поведение |
|---|---|---|---|
| CWG 2001 | C++98 | поведение использования нестандартных директив не было ясно | сделано условно поддерживаемым |
См. также
| Документация C++ по Предопределённые макросы | |
| Документация C++ по Индекс макросов | |
| Документация C по предпроцессор |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/preprocessor