Из того, что я видел, основное использование для #if defined
- проверка нескольких макроопределений в одной строке. В противном случае, для условных обозначений одного макроопределения, насколько я знаю, они идентичны.
#include <stdio.h>
int main()
{
#if defined(FOO) && defined(BAR)
printf("foobar!\n");
#else
printf("nothing.\n");
#endif
return 0;
}
$ tcc -DFOO -run a.c
nothing.
$ tcc -DBAR -run a.c
nothing.
$ tcc -DFOO -DBAR -run a.c
foobar!
Кроме того, вышеприведенная программа прекрасно компилируется с gcc -Wall -ansi a.c
, что говорит о том, что #if defined
является правильным ANSI C. Более того, в этом кратком обзоре ANSI C за 1987 перечисляется #if defined
как новое определенное поведение для препроцессора согласно стандартам ANSI - этот должен быть стандартным для любого ANSI-совместимого компилятора, который вы будете использовать.
Если бы вы не использовали #if defined
, вам пришлось бы делать
#ifdef FOO
#ifdef BAR
printf("foobar!\n");
#endif /* BAR */
#endif /* FOO */
Также, Руководство Redhat для препроцессора C говорит
#if defined MACRO
точно соответствует #ifdef MACRO
.