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