C++ 在GCC中,将0参数传递给变量宏失败,但仅在C++;?

C++ 在GCC中,将0参数传递给变量宏失败,但仅在C++;?,c++,c,gcc,macros,clang,C++,C,Gcc,Macros,Clang,在下面的代码中,CHOOSE\u MACRO应该根据参数的数量在传递给它的两个宏之间进行选择:FOO()应该扩展到RESULT0,而FOO(x)应该扩展到RESULT1 这对Clang(C)和C++()、都适用。 中,p> > C代码(),但C++代码两个调用产生结果 () 发生了什么,我如何才能以跨平台的方式实现这一点 #define CHOOSE_MACRO(_0, _1, NAME, ...) NAME #define FOO(...) CHOOSE_MACRO(~~, ##__VA_AR

在下面的代码中,
CHOOSE\u MACRO
应该根据参数的数量在传递给它的两个宏之间进行选择:
FOO()
应该扩展到
RESULT0
,而
FOO(x)
应该扩展到
RESULT1

这对Clang(C)和C++()、

都适用。 中,p> > C代码(),但C++代码<强>两个调用产生<代码>结果<代码> <强>() 发生了什么,我如何才能以跨平台的方式实现这一点

#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
}

我认为你完全错了。我稍微增强了代码,并尝试了很多不同的C++编译器,它的工作方式是你想用的。
请看这里:

我觉得标准对于这个(
####uuu VA_uargs uu
)构造是很有用的,所以g++将其实现为一个扩展。因此,为了获得结果,请传递一个
-std=gnu++14
选项。请看这里:当然它是一个扩展,但表面上这两个编译器都支持它,所以我只是想理解为什么它不工作。也有可能(尽管很烦人)到处工作。有趣。添加
-std=c++0x
会更改结果。我假设默认值是
gnu++0x