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