代码之家  ›  专栏  ›  技术社区  ›  Finley

宏函数中可变参数的计数

  •  2
  • Finley  · 技术社区  · 7 年前

    #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,这是为什么?

    2 回复  |  直到 7 年前
        1
  •  2
  •   StoryTeller - Unslander Monica    7 年前

    _1 _10 从一开始就是占位符,以确保 N 位于正确的数字上方 10 0 (取决于 __VA_ARGS__

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


    关于编辑,这是预处理器的限制。空标记序列是宏的有效参数。所以这实际上是一个单一的论点,因为 __VA_ARGS__ , (注意逗号)成为这样一个参数。

    这是一个众所周知的问题,以至于C++20添加了 __VA_OPT__

    #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)
    
        2
  •  1
  •   P.W    7 年前

    没有什么特别的 _1 , _2 i , j k 取而代之。

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

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

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