繁体   English   中英

计算宏函数中可变参数的数量

[英]Count number of variadic arguments in macro function

这是我在OpenCV中看到的两行

#define CV_VA_NUM_ARGS_HELPER(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...)    N
#define CV_VA_NUM_ARGS(...)      CV_VA_NUM_ARGS_HELPER(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)

我想这是要计算传递给CV_VA_NUM_ARGS的可变参数的数量。 以以下代码为例:

CV_VA_NUM_ARGS(a,b,c)

将扩展到

CV_VA_NUM_ARGS_HELPER(a,b,c,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)

在这一点上,我坚持了解正在发生的事情。 具体来说, 我不知道_1_2等的实用程序。 谁能帮我吗? 这是一篇类似的帖子,但对我来说比较复杂。

编辑:当我不传递任何参数(例如CV_VA_NUM_ARGS_HELPER() )时,宏将被替换为1而不是0,这是为什么呢?

从一开始, _1_10只是占位符,以确保N定位在100的正确数字上(取决于__VA_ARGS__ )。 他们除了担任职位外没有其他目的。

由于每个宏参数必须具有不同的标识符,因此这些标识符与任何标识符一样好。


关于您的编辑,这是预处理器的限制。 空令牌序列是宏的有效参数。 因此它实际上是一个参数,因为__VA_ARGS__ , (注意逗号)变成了这样一个参数。

这是一个众所周知的问题,以至于C ++ 20添加了__VA_OPT__预处理程序宏。 它允许有条件地添加逗号。 在C ++ 20上,可以将实现固定为按预期工作,如下所示:

#define CV_VA_NUM_ARGS(...)      CV_VA_NUM_ARGS_HELPER(__VA_ARGS__ __VA_OPT__(,) 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)

_1_2等没有什么特别的。您可以将ijk替换为它们。

N的值取决于您传递的参数数量,因为N成为宏扩展中的第11个元素(因为有10个占位符)。

因此,对于CV_VA_NUM_ARGS(a,b,c) ,第11个元素为3。对于CV_VA_NUM_ARGS(a,b,c,d,e,f) ,第11个元素为6,依此类推。

请注意,使用此特定代码,您最多只能计算10个参数。 使用10个以上的参数将生成编译器错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM