Spec-Zone.ru › C

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

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

Директивы

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

  • # символ
  • инструкция препроцессора (одна из define, undef, include, if, ifdef, ifndef, else, elif, elifdef, elifndef(начиная с C23), endif, line, embed(начиная с C23), error, warning(начиная с C23), pragma) [1]
  • аргументы (зависят от инструкции)
  • перевод строки.

Пустая директива (# и следующий за ним перевод строки) допускается и не оказывает никакого эффекта.

Возможности

Препроцессор позволяет выполнять следующие преобразования исходного файла:

  • условно компилировать части исходного файла (управляется директивами #if, #ifdef, #ifndef, #else, #elif, #elifdef, #elifndef(начиная с C23) и #endif).
  • заменять текстовые макросы, при необходимости объединяя или заключая в кавычки идентификаторы (управляется директивами #define и #undef, а также операторами # и ##)
  • подключать другие файлы (управляется директивой #include и проверяется с помощью __has_include(начиная с C23))
  • вызывать ошибку или предупреждение(начиная с C23) (управляется директивой #error или #warning соответственно(начиная с C23))

Следующие аспекты работы препроцессора можно контролировать:

  • определяемое реализацией поведение (управляется директивой #pragma и оператором _Pragma(начиная с C99))
  • имя файла и сведения о номере строки, доступные препроцессору (управляется директивами #line)

Сноски

  1. Это директивы, определенные стандартом. Стандарт не определяет поведение для других директив: они могут игнорироваться, иметь полезное значение или делать программу некорректной. Даже если такие директивы игнорируются, после завершения работы препроцессора они удаляются из исходного кода. Распространенным нестандартным расширением является директива #warning, которая выводит сообщение, заданное пользователем, во время компиляции.(до C23)

Пример

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
    • 6.10 Директивы препроцессирования (стр.: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
    • 6.10 Директивы препроцессирования (стр.: 117–129)
  • Стандарт C11 (ISO/IEC 9899:2011):
    • 6.10 Директивы препроцессирования (стр.: 160–178)
  • Стандарт C99 (ISO/IEC 9899:1999):
    • 6.10 Директивы препроцессирования (стр.: 145–162)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
    • 3.8 Директивы препроцессирования

См. также

Документация по C: Предопределенные макросимволы
Документация по C: Указатель макросимволов
Документация по C++: Препроцессор

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/preprocessor

Spec-Zone.ru

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