在 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() 应该扩展为 RESULT0FOO(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++ 中?的主要内容,如果未能解决你的问题,请参考以下文章

可以将逗号和参数传递给 C++ 宏吗?

将可变参数函数模板参数传递给另一个函数

在页面模型中将参数传递给 TestCafe 选择器

如何在反应测试库中将参数传递给 getByText?

如何使用 jquery 将可变参数传递给匿名函数?

是否可以将可变数量的参数传递给redshift中的存储过程?