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]
  • аргументы (в зависимости от инструкции)
  • перевод строки

Директива NULL (#, за которой следует перевод строки) разрешена и не оказывает никакого влияния.

Возможности

Предпроцессор обладает возможностями трансляции исходного файла:

  • условной компиляции частей исходного файла (управляемой директивами #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)

Ссылки

  • Стандарт 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/w/c/preprocessor

Spec-Zone.ru

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