C/C++可变参数宏, 编译期获取宏的可变参数长度

本文介绍了一种使用C/C++宏来计算传入可变参数数量的方法。该方法适用于10个参数以内的场景,并详细解释了如何通过宏展开实现参数计数。

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

C/C++ 可变参数宏, 编译器展开获取可变参数的长度.
参考https://groups.google.com/forum/#!forum/comp.std.c/d-6Mj5Lko_s
同时参考了cppformat源码

#define MARCO_EXPAND(...)                 __VA_ARGS__
#define RSEQ_N() 10,9,8,7,6,5,4,3,2,1,0
#define ARG_N(_1,_2,_3,_4,_5,_6,_7,_8,_9_10,N) N

#define GET_ARG_COUNT_INNER(...)    MARCO_EXPAND(ARG_N(__VA_ARGS__))
#define GET_ARG_COUNT(...)          GET_ARG_COUNT_INNER(__VA_ARGS__, RSEQ_N())


以上代码片对计算10个参数以内的数量的参数个数, 具体原理如下:


其中如下的宏展开之后就是一个串参数序列:
GET_ARG_COUNT(a, b, c)      MARCO_EXPAND(ARG_N(a, b, c, 10,9,8,7,6,5,4,3,2,1,0))

而通过ARG_N(...)   a, b, c, 10,9,8,7,6,5,4,3,2,1,0

这个宏展开之后可以理解为是一个反向的下标, 取出具体位置的数字即是最终的数值.需要说明下:RSEQ_N()宏中定义的数字, 跟ARG_N(...)宏中定义的数字代表的参数个数一定是相等的, 通俗一点理解起来:就是将数据列的反向序排列然后通过插入参数之后取互补位置的下标即可.  



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值