[英]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
定位在10
到0
的正确数字上(取决于__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
等没有什么特别的。您可以将i
, j
, k
替换为它们。
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.