Логическое значение в ifdef: "#ifdef A && B" совпадает с "#iffined (A) && определен (B)"? - PullRequest
75 голосов
/ 21 августа 2009

В C ++ это:

#ifdef A && B

так же, как:

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

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

Ответы [ 6 ]

79 голосов
/ 21 августа 2009

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

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

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

44 голосов
/ 21 августа 2009

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

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

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

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

#ifdef max 
#ifndef min
1 голос
/ 27 ноября 2018

Для тех, кто может искать, например, (UNIX / g ++), который немного отличается от OP, это может помочь:

`

#if(defined A && defined B && defined C)
    const string foo = "xyz";
#else
#if(defined A && defined B)
    const string foo = "xy";
#else
#if(defined A && defined C)
    const string foo = "xz";
#else
#ifdef A
    const string foo = "x";
#endif
#endif
#endif
#endif
1 голос
/ 20 июля 2016

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

1

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

2

#ifdef A
#ifdef B
printf("define test");
#endif
#endif
0 голосов
/ 17 сентября 2016

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

#if (MAX && !MIN)

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

0 голосов
/ 29 января 2013

Я думаю, что OP может спросить об утверждении "#if 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 
...