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