C++计算 __VA_ARGS__参数个数

本文介绍了一种在C++中使用宏定义来计算可变参数个数的方法,通过巧妙利用预处理器特性实现参数数量的推断,适用于C++11/14之前的版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • C++中可以通过宏定义,计算可变参数__VA_ARGS__的参数个数
  • 代码:
#include <iostream>
#define ARG_N(...) \
    ARG_N_(0, ##__VA_ARGS__, ARG_N_RESQ())

#define ARG_N_(...) \
    ARG_N_M(__VA_ARGS__)

#define ARG_N_M( \
          _0, _1, _2, _3, _4, _5, _6, _7, _8, _9,_10, \
         _11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \
         _21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \
         _31,_32,_33,_34,_35,_36,_37,_38,_39,_40, \
         _41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \
         _51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \
         _61,_62,_63,N,...) N

#define ARG_N_RESQ() \
         63,62,61,60,                   \
         59,58,57,56,55,54,53,52,51,50, \
         49,48,47,46,45,44,43,42,41,40, \
         39,38,37,36,35,34,33,32,31,30, \
         29,28,27,26,25,24,23,22,21,20, \
         19,18,17,16,15,14,13,12,11,10, \
         9,8,7,6,5,4,3,2,1,0

int main()
{
    // 0
    int i = ARG_N();
    std::cout << i << std::endl;
    // 1
    i = ARG_N(1);
    std::cout << i << std::endl;
    // 2
    i = ARG_N(1,2);
    std::cout << i << std::endl; 
    // 3              
    i = ARG_N(1,2,3);
    std::cout << i << std::endl;
    // 4          
    i = ARG_N(1,2,3,4);
    std::cout << i << std::endl;           
    i = ARG_N(1,2,3,4,5);
    std::cout << i << std::endl;         
    i = ARG_N(1,2,3,4,5,6);
    std::cout << i << std::endl;       
    i = ARG_N(1,2,3,4,5,6,7);
    std::cout << i << std::endl;     
    i = ARG_N(1,2,3,4,5,6,7,8);
    std::cout << i << std::endl;   
    i = ARG_N(1,2,3,4,5,6,7,8,9);
    std::cout << i << std::endl; 
    i = ARG_N(1,2,3,4,5,6,7,8,9,10);
    std::cout << i << std::endl;
    // 20
    i = ARG_N(\
            1,2,3,4,5,6,7,8,9,10,\
            1,2,3,4,5,6,7,8,9,10 );
    std::cout << i << std::endl;
    return 0;
}
  • 注意:参数个数推断与C++标准有关,启用C++11/14时,可能会有其他效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值