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