将8个参数传递给variadic宏在GCC中失败,但仅在C ++中失败?

时间:2016-11-18 23:58:12

标签: c++ c gcc macros clang

在以下代码中,CHOOSE_MACRO应根据参数的数量在传递给它的两个宏之间进行选择:FOO()应扩展为RESULT0FOO(x) 1}}应扩展为RESULT1

这适用于Cng(http://rextester.com/LRX65441)和C ++(http://rextester.com/FYC46680)的Clang。

在GCC中,它适用于C代码(http://rextester.com/VWAPR56841),但在C ++代码 中,两个调用都会生成RESULT1 ({{3} })。

发生了什么,我怎样才能以跨平台的方式开展这项工作?

#define CHOOSE_MACRO(_0, _1, NAME, ...) NAME
#define FOO(...) CHOOSE_MACRO(~~, ##__VA_ARGS__, RESULT1, RESULT0)

void foo()
{
    FOO();  // should produce RESULT0  -  actually produces RESULT1 for gcc -x c++
}

void bar()
{
    FOO(x); // should produce RESULT1
}

1 个答案:

答案 0 :(得分:0)

我认为你错了。我对你的代码进行了一些增强,并在许多不同的C ++编译器上进行了尝试,并且每次都按照你想要的方式工作。

见这里:https://godbolt.org/g/D6rgxS