【发布时间】:2016-11-18 23:58:12
【问题描述】:
在下面的代码中,CHOOSE_MACRO 应该根据参数的数量在传递给它的 2 个宏之间进行选择:FOO() 应该扩展为 RESULT0,FOO(x) 应该扩展为 @987654330 @。
这适用于 C (http://rextester.com/LRX65441) 和 C++ (http://rextester.com/FYC46680) 的 Clang。
在 GCC 中,它适用于 C 代码 (http://rextester.com/VWAPR56841),但在 C++ 代码中两个调用都会产生 RESULT1 (http://rextester.com/ZNEKAV71986)。
发生了什么,我怎样才能使这项工作以跨平台的方式工作?
#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
}
【问题讨论】:
-
在我看来,标准对于这个 (
##__VA_ARGS__) 构造是有遗漏的,所以 g++ 将它作为扩展来实现。所以,为了得到你的结果,传递一个-std=gnu++14选项。见这里:wandbox -
当然这是一个扩展,但表面上这两个编译器都支持它,所以我只是想了解它为什么不起作用。也有可能(尽管很烦人)。