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