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

Spec-Zone.ru

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