4.2.1 Если определено ¶
Простейший условный оператор имеет вид
#ifdef MACRO controlled text #endif /* MACRO */
Этот блок называется условной группой. Управляемый текст будет включён в выходные данные препроцессора тогда и только тогда, когда макрос MACRO определён. Мы говорим, что условный оператор успешен, если MACRO определён, и неуспешен, если он не определён.
Текст управляемой части внутри условной группы может содержать директивы препроцессора. Они выполняются только в том случае, если условный оператор успешен. Вы можете вкладывать условные группы в другие условные группы, но они должны быть полностью вложены. Другими словами, ‘#endif’ всегда соответствует ближайшему ‘#ifdef’ (или ‘#ifndef’, или ‘#if’). Кроме того, вы не можете начать условную группу в одном файле и завершить её в другом.
Даже если условный оператор неуспешен, управляемый текст внутри него всё равно проходит начальную обработку и токенизацию. Следовательно, он должен быть лексически корректным C-кодом. Как правило, это имеет значение только в том случае, если все комментарии и строковые литералы внутри неуспешной условной группы должны быть должным образом завершены.
Комментарий, следующий за ‘#endif’, не является обязательным, но он полезен, если управляемый текст объёмный, так как он помогает сопоставить ‘#endif’ с соответствующим ‘#ifdef’. В старых программах иногда MACRO помещали непосредственно после ‘#endif’ без заключения в комментарий. Это некорректный код в соответствии со стандартом C. CPP принимает его с предупреждением. Это никогда не влияет на то, с каким ‘#ifndef’ соответствует ‘#endif’.
Иногда нужно использовать код, если макрос не определён. Для этого можно использовать ‘#ifndef’ вместо ‘#ifdef’. Частое применение ‘#ifndef’ — включение кода только при первом включении заголовочного файла. См. Заголовочные файлы, включаемые только один раз.
Определения макросов могут различаться между компиляциями по нескольким причинам. Вот несколько примеров.
- Некоторые макросы предопределены для каждого типа машины (см. Системно-зависимые предопределённые макросы). Это позволяет предоставлять код, специально настроенный для конкретной машины.
- Заголовочные файлы системы определяют больше макросов, связанных с реализуемыми функциями. Вы можете проверить эти макросы с помощью условных операторов, чтобы избежать использования системной функции на машине, где она не реализована.
- Макросы можно определить или удалить с помощью параметров командной строки -D и -U при компиляции программы. Вы можете скомпилировать один и тот же исходный файл в две разные программы, выбрав имя макроса для указания нужной программы, написав условные операторы для проверки того, как определён этот макрос, и затем контролируя состояние макроса с помощью параметров командной строки, возможно, заданных в файле Makefile. См. Вызов.
- Ваша программа может иметь специальный заголовочный файл (часто называемый config.h), который корректируется во время компиляции. Он может определять или не определять макросы в зависимости от функций системы и желаемых возможностей программы. Корректировка может быть автоматизирована с помощью инструмента, такого как
autoconf, или выполнена вручную.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-10.5.0/cpp/Ifdef.html