Ответ 1
Они не совпадают. Первый не работает (я тестировал gcc 4.4.1). Сообщение об ошибке:
test.cc:1:15: предупреждение: дополнительные токены в end директивы #ifdef
Если вы хотите проверить, определено ли несколько вещей, используйте второй.
В С++ это:
#ifdef A && B
то же самое, что:
#if defined(A) && defined(B)
?
Я думал, что это не так, но я не смог найти разницу с моим компилятором (VS2005).
Они не совпадают. Первый не работает (я тестировал gcc 4.4.1). Сообщение об ошибке:
test.cc:1:15: предупреждение: дополнительные токены в end директивы #ifdef
Если вы хотите проверить, определено ли несколько вещей, используйте второй.
Вы можете использовать определенный оператор в директива #if использовать выражения которые оценивают до 0 или 1 в пределах препроцессорная линия. Это избавит вас от используя вложенные предпроцессорные директивы. Скобки вокруг идентификатора являются необязательными. Например:
#if defined (MAX) && ! defined (MIN)
Без использования определенного оператора, вы должны были бы включить следуя двум директивам для выполнения в приведенном выше примере:
#ifdef max #ifndef min
Следующие результаты одинаковы:
1.
#define A
#define B
#if(defined A && defined B)
printf("define test");
#endif
2.
#ifdef A
#ifdef B
printf("define test");
#endif
#endif
По состоянию на VS2015 ни одно из вышеперечисленных работ не работает. Правильная директива:
#if (MAX && !MIN)
подробнее здесь
Я думаю, возможно, OP хочет спросить о статусе "# COND_A && COND_B", а не "#ifdef COND_A & & COND_B"...
Они также разные. "#if COND_A & & COND_B" может судить о логическом выражении, например:
#if 5+1==6 && 1+1==2
....
#endif
переменная в вашем коде также может использоваться в этом статусе макроса:
int a = 1;
#if a==1
...
#endif