4.2.1 Ifdef
Самый простой вид условного оператора —
#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-4.9.4/cpp/Ifdef.html