Boolean in ifdef: "#ifdef A && B" совпадает с "#if defined (A) && defined (B)"?

В С++ это:

#ifdef A && B

то же самое, что:

#if defined(A) && defined(B)

?

Я думал, что это не так, но я не смог найти разницу с моим компилятором (VS2005).

Ответ 1

Они не совпадают. Первый не работает (я тестировал gcc 4.4.1). Сообщение об ошибке:

test.cc:1:15: предупреждение: дополнительные токены в end директивы #ifdef

Если вы хотите проверить, определено ли несколько вещей, используйте второй.

Ответ 2

Условная компиляция

Вы можете использовать определенный оператор в директива #if использовать выражения которые оценивают до 0 или 1 в пределах препроцессорная линия. Это избавит вас от используя вложенные предпроцессорные директивы. Скобки вокруг идентификатора являются необязательными. Например:

#if defined (MAX) && ! defined (MIN)  

Без использования определенного оператора, вы должны были бы включить следуя двум директивам для выполнения в приведенном выше примере:

#ifdef max 
#ifndef min

Ответ 3

Следующие результаты одинаковы:

1.

#define A
#define B
#if(defined A && defined B)
printf("define test");
#endif

2.

#ifdef A
#ifdef B
printf("define test");
#endif
#endif

Ответ 4

По состоянию на VS2015 ни одно из вышеперечисленных работ не работает. Правильная директива:

#if (MAX && !MIN)

подробнее здесь

Ответ 5

Я думаю, возможно, 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