在以下代码中,CHOOSE_MACRO
应根据参数的数量在传递给它的两个宏之间进行选择:FOO()
应扩展为RESULT0
,FOO(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
}
答案 0 :(得分:0)
我认为你错了。我对你的代码进行了一些增强,并在许多不同的C ++编译器上进行了尝试,并且每次都按照你想要的方式工作。