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