从Visual Studio中的变量参数计数宏提供常量参数计数宏的输入

时间:2014-01-03 09:57:40

标签: c++ visual-studio macros

我想定义一个宏,它会为每个不是前缀的参数添加前缀。

我已经定义了一些常量参数计数宏,然后使用变量参数定义一个以调用其他参数。我的问题是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用于此项目

1 个答案:

答案 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}}一个不可分割的元素作为单独的元素。