Spec-Zone.ru › C++

Предпроцессор

Предпроцессор выполняется на четвёртой стадии трансляции перед компиляцией. Результатом работы предпроцессора является один файл, который затем передаётся в сам компилятор.

Директивы

Директивы предпроцессора управляют его поведением. Каждая директива занимает одну строку и имеет следующий формат:

  • символ #.
  • последовательность:
    • имя стандартной директивы (перечислены ниже) с соответствующими аргументами, или
    • одна или несколько токенов предпроцессора, где начальный токен не является именем стандартной директивы, в этом случае директива поддерживается условно с определённым реализацией поведением (например, распространённым нестандартным расширением является директива #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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API