在 GCC 中将 0 参数传递给可变参数宏失败,但仅在 C++ 中?
Posted
技术标签:
【中文标题】在 GCC 中将 0 参数传递给可变参数宏失败,但仅在 C++ 中?【英文标题】:Passing 0 arguments to variadic macro fails in GCC, but only in C++? 【发布时间】: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
当然这是一个扩展,但表面上这两个编译器都支持它,所以我只是想了解它为什么不起作用。也有可能(尽管很烦人)。
【参考方案1】:
我认为你完全错了。我稍微增强了您的代码,并在许多不同的 C++ 编译器上进行了尝试,它每次都能按照您想要的方式工作。
请看这里:https://godbolt.org/g/D6rgxS
【讨论】:
有趣。添加-std=c++0x
会改变结果。我假设默认是gnu++0x
。以上是关于在 GCC 中将 0 参数传递给可变参数宏失败,但仅在 C++ 中?的主要内容,如果未能解决你的问题,请参考以下文章