#ifdef внутри вызова макроса работает с gcc, но не с msvc

У меня есть макрос TYPELIST, который принимает различные аргументы. Я хочу что-то вроде

typedef TYPELIST(A
,B
,C
,D
#ifdef BLA_
,E
#endif
,F)

Это прекрасно работает с GCC. Однако, когда я пытаюсь скомпилировать его с помощью MSVC, он анализирует ifdef и endif в качестве аргументов макроса. Я знаю, что одним из способов было бы поместить вызов макроса в ifdef. Однако, если у меня огромный список и я хочу включить разные классы в зависимости от определенных макросов, это будет утомительно. Есть ли конкретная причина, почему это работает в gcc, а не с MSVC?

2

Решение

Использование #ifdef внутри макроса не разрешено. Я немного удивлен, что GCC позволяет это. Боюсь, вы должны поместить #ifdef вокруг всего определения, т.е.

#ifdef BLA_
typedef TYPELIST(a,b,c,d,e,f)
#else
typedef TYPELIST(a,b,c,d,f)
#endif
0

Другие решения

В соответствии со стандартом (§16.3.4 / 3), «в результате полностью
макро-замененная последовательность токена предварительной обработки не обрабатывается как
директива предварительной обработки, даже если она похожа на одну, […] «. Если
G ++ обрабатывает #ifdef/#endif здесь ошибка в
компилятор (по крайней мере, если вы запросили соответствие стандартам,
например с -std=...).

0

По вопросам рекламы [email protected]