У С ++ це:
#ifdef A && B
такий же як і:
#if defined(A) && defined(B)
?
Я думав, що це не так, але я не зміг знайти різниці зі своїм компілятором (VS2005).
У С ++ це:
#ifdef A && B
такий же як і:
#if defined(A) && defined(B)
?
Я думав, що це не так, але я не зміг знайти різниці зі своїм компілятором (VS2005).
Відповіді:
Вони не однакові. Перший не працює (я тестував у gcc 4.4.1). Повідомлення про помилку було:
test.cc:1:15: попередження: зайві маркери в кінці директиви #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
#else
, можуть спричинити проблему. Тільки перший варіант насправді означає саме те, про що просив запитувач.
Для тих, хто може шукати наприклад (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
Станом на VS2015 жодне з вищезазначених не працює. Правильна директива:
#if (MAX && !MIN)
дивіться більше тут