4.2.3 Определено
Специальный оператор defined используется в выражениях ‘#if’ и ‘#elif’ для проверки, определено ли определённое имя как макрос. defined name и defined (name) — оба выражения, значение которых равно 1, если name определено как макрос в текущей точке программы, и 0 в противном случае. Таким образом, #if defined MACRO точно эквивалентно #ifdef MACRO.
defined полезно, когда вы хотите проверить существование сразу нескольких макросов. Например,
#if defined (__vax__) || defined (__ns16000__)
будет успешным, если любое из имён __vax__ или __ns16000__ определено как макрос.
Условные операторы, написанные так:
#if defined BUFSIZE && BUFSIZE >= 1024
можно, как правило, упростить до просто #if BUFSIZE >= 1024, поскольку если BUFSIZE не определено, оно будет интерпретироваться как имеющее значение ноль.
Если оператор defined появляется в результате макроподстановки, стандарт C говорит, что поведение неопределённо. GNU cpp рассматривает его как настоящий оператор defined и оценивает его обычно. Он будет предупреждать, где ваш код использует эту функцию, если вы используете командную опцию -Wpedantic, так как другие компиляторы могут обрабатывать его по-разному. Предупреждение также включено опцией -Wextra, и также может быть включено индивидуально с помощью -Wexpansion-to-defined.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-13.3.0/cpp/Defined.html