Spec-Zone.ru › GCC 12 CPP

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API