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-9.5.0/cpp/Ifdef.html