У меня есть макрос TYPELIST, который принимает различные аргументы. Я хочу что-то вроде
typedef TYPELIST(A
,B
,C
,D
#ifdef BLA_
,E
#endif
,F)
Это прекрасно работает с GCC. Однако, когда я пытаюсь скомпилировать его с помощью MSVC, он анализирует ifdef и endif в качестве аргументов макроса. Я знаю, что одним из способов было бы поместить вызов макроса в ifdef. Однако, если у меня огромный список и я хочу включить разные классы в зависимости от определенных макросов, это будет утомительно. Есть ли конкретная причина, почему это работает в gcc, а не с MSVC?
Использование #ifdef внутри макроса не разрешено. Я немного удивлен, что GCC позволяет это. Боюсь, вы должны поместить #ifdef вокруг всего определения, т.е.
#ifdef BLA_
typedef TYPELIST(a,b,c,d,e,f)
#else
typedef TYPELIST(a,b,c,d,f)
#endif
В соответствии со стандартом (§16.3.4 / 3), «в результате полностью
макро-замененная последовательность токена предварительной обработки не обрабатывается как
директива предварительной обработки, даже если она похожа на одну, […] «. Если
G ++ обрабатывает #ifdef/#endif
здесь ошибка в
компилятор (по крайней мере, если вы запросили соответствие стандартам,
например с -std=...
).