C/C++ 使用宏在编译期计算可变参数个数

本文介绍了如何在C/C++中利用宏在编译期计算可变参数个数,以实现类似printf的安全功能。cppformat库被提及作为示例,它通过模板实现类型安全,并在编译期计算参数。讨论中提到了VC编译器可能遇到的问题及解决办法。

参考https://groups.google.com/forum/#!forum/comp.std.c/d-6Mj5Lko_s

同时参考了cppformat源代码


C++是不提倡可变参数,理由不说了。但是类似printf的函数族使用起来确实很方便,我在查找printf的替代方案时无意间看到的。感慨下,微软的CString::Format确实很好用

cppformat提供类似printf的功能,但是又是类型安全的,其核心是利用C++强大的模版功能。在实现上,cppformat实现了在编译期计算可变参数个数,原理就是https://groups.google.com/forum/#!forum/comp.std.c/d-6Mj5Lko_s里面讨论的


为简便起见,这里只以最多三个可变参数做讨论

#define   ARG_N(a1,a2,a3,N,...)  N
这个宏的作用是,截取并返回参数列表的第四个参数

#define  ARG_N_HELPER(...)  ARG_N(__VA_ARGS__)
辅助宏,为使结果计算正确


#define  COUNT_ARG(...)  ARG_N_HELPER(__VA_ARGS__,3,2,1,0)
计算可变参数个数宏,可变参数个数在   大于0,小于等于3   内范围内计算正确


例如:

COUNT_ARG(x)     ->  1
COUNT_ARG(x,y)   ->  2
COUNT_ARG(x,y,z) ->  3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值