gpt4 book ai didi

c++ - 计算宏函数中可变参数的数量

转载 作者:搜寻专家 更新时间:2023-10-31 01:27:11 25 4
gpt4 key购买 nike

这是我在 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等的效用谁能帮帮我?这是一个类似的 post虽然对我来说更复杂。

编辑:当我不传递任何参数时(例如 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)

关于c++ - 计算宏函数中可变参数的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53847219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com