【发布时间】:2017-10-17 15:43:21
【问题描述】:
Overloading Macro on Number of Arguments
https://codecraft.co/2014/11/25/variadic-macros-tricks/
我一直在查看上面的两个链接,试图让以下代码工作:
#define _GET_NUMBER(_0, _1, _2, _3, _4, _5, NAME, ...) NAME
#define OUTPUT_ARGS_COUNT(...) _GET_NUMBER(_0, ##__VA_ARGS__, 5, 4, 3, 2, 1, 0)
...
cout << OUTPUT_ARGS_COUNT("HelloWorld", 1.2) << endl;
cout << OUTPUT_ARGS_COUNT("HelloWorld") << endl;
cout << OUTPUT_ARGS_COUNT() << endl;
这会编译、运行并给出以下输出:
2
1
1
我一生都无法弄清楚为什么调用 OUTPUT_ARGS_COUNT() 给我的是 1 而不是 0。我对我尝试使用的代码有很好的理解,但它对我来说还是有点希腊语所以我想我可能没有正确应用某些东西,尽管我实际上是从堆栈溢出链接中复制并粘贴了示例代码。
我正在使用 g++ 5.4.0 20160609 进行编译。
您可以向我指出任何想法或其他资源,我们将不胜感激。
【问题讨论】:
-
你可以在gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html看到:"上面的解释对于只有一个宏参数是可变参数参数的情况是模棱两可的,因为试图区分是否没有参数是没有意义的at all 是一个空参数或缺少参数。当符合特定 C 标准时,CPP 保留逗号。否则,逗号作为标准的扩展被删除。".
-
检查这个stackoverflow.com/questions/2308243/…,那里的解决方案在零参数上也失败了
标签: c++ c macros g++ variadic-macros