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

Spec-Zone.ru

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