При использовании директив #if и #elifдля упрощения записи сложного условия выбора можно использовать унарную препроцессорную операцию defined. Она имеет формат:
defined операнд
В качестве операнда может выступать идентификатор, заключенный в скобки идентификатор и вызов макроса. Выражение принимает значение 1, если идентификатор является препроцессорным (ранее определен директивой #define), в противном случае - значение 0.
Выражение
#if defined операнд
эквивалентно выражению
#ifdef операнд
При рассмотрении такого простого случая достоинства операции definedне проявляются. Поясним с помощью примера полезные возможности операции defined.
Пример:
#if defined Y && !defined N
текст
#endif
Текст включается в компилируемый текст только в том случае, если идентификатор Y определен как препроцессорный, а идентификатор N не определен.
Обработку препроцессор ведет следующим образом. Сначала, определяется истинность выражений defined Y и !defined N. К результатам применяется операция конъюнкции &&, и при истинности ее результата текст передается компилятору.
Не используя операцию defined, то же самое условие можно записать таким способом:
#ifdef Y
#ifndef N
текст
#endif
#endif
Таким образом, из примера видно, что
#if defined эквивалентно #ifdef
#if !defined эквивалентно #ifndef
Стандарт языка С++ не определил defined в качестве ключевого слова. В тексте программы его можно использовать в качестве идентификатора. Специфическое значение имеет defined только при формировании условий, проверяемых в директивах #if и #elif. Запрещено использовать defined в директивах #define и #undef.