Предпроцессор
Предпроцессор выполняется на этапе трансляции 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)
Примечания
- Это директивы, определённые стандартом. Стандарт не определяет поведение для других директив: они могут быть проигнорированы, иметь какое-то полезное значение или сделать программу некорректной. Даже если они игнорируются, они удаляются из исходного кода после завершения работы предпроцессора. Распространённое нестандартное расширение — директива
#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