我想定义一个宏,它会为每个不是前缀的参数添加前缀。
我已经定义了一些常量参数计数宏,然后使用变量参数定义一个以调用其他参数。我的问题是varadic宏没有为常量宏提供适当的输入。
#define prefix2(pefixV, a1, a2) pefixV##a1, pefixV##a2
#define prefix3(pefixV, a1, a2, a3) prefix2(pefixV, x, y)##, ##pefixV##z
#define prefixX(count, pefixV, ...) prefix##count(pefixV, __VA_ARGS__)
//MacroTester from stackoverflow
#define QUOTE(str) #str
#define EXPAND_AND_QUOTE(str) QUOTE(str)
#define TESTE EXPAND_AND_QUOTE(TEST)
int main(int argc, const char* argv[])
{
#define TEST prefixX(2, simplePrefix, X, Y)
static_assert(false, TESTE);
return 0;
}
静态断言打印:static assertion failed with "simplePrefixX, Y, simplePrefix"
我的预期结果为simplePrefixX, simplePrefixY
有没有办法强制variadic宏提供适当的输入?
我可以将Visual Studio 2012或2013用于此项目
答案 0 :(得分:0)
我找到了解决方案。
#define prefix2(pefixV, a1, a2) pefixV##a1, pefixV##a2
#define prefix3(pefixV, a1, a2, a3) prefix2(pefixV, x, y)##, ##pefixV##z
#define macroMagic(x) x
#define prefixX(count, pefixV, ...) macroMagic(prefix##count(pefixV, __VA_ARGS__))
//MacroTester from stackoverflow
#define QUOTE(str) #str
#define EXPAND_AND_QUOTE(str) QUOTE(str)
#define TESTE EXPAND_AND_QUOTE(TEST)
int main(int argc, const char* argv[])
{
#define TEST prefixX(2, simplePrefix, X, Y)
static_assert(false, TESTE);
return 0;
}
它有效,因为macroMagic
之前调用了prefix##count
,并且__VA_ARGS__
从X, Y
更改为X
Y
,{{1}}一个不可分割的元素作为单独的元素。