Spec-Zone.ru › GCC 4 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-4.9.4/cpp/Ifdef.html

Spec-Zone.ru

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