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