Namespaces
Variants

Preprocessor

From cppreference.net
< 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 (since C23) и #endif ).
  • замена текстовых макросов с возможной конкатенацией или квотированием идентификаторов (управляется директивами #define и #undef , и операторами # и ## )
  • включение других файлов (управляется директивой #include и проверяется с помощью __has_include (since C23) )
  • вызов ошибки или предупреждения (since C23) (управляется директивой #error или #warning соответственно (since C23) )

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

Сноски

  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 documentation для Predefined Macro Symbols
C documentation для Macro Symbol Index
C++ documentation для Preprocessor