C/C++ 使用宏在编译期计算可变参数个数
来源:互联网 发布:怎么看淘宝收货时间 编辑:程序博客网 时间:2024/06/07 05:28
参考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) -> 1COUNT_ARG(x,y) -> 2COUNT_ARG(x,y,z) -> 3以COUNT_ARG(x,y)为例,示意计算过程COUNT_ARG(x,y)-> ARG_N_HELPER(X,Y,3,2,1,0)-> ARG_N(X,Y,3,2,1,0) 截取第四个参数 2
另外,在VC编译器上,编译可能会失败需要定义下面的宏
#define ARG_T(t) t#define ARG_N_HELPER(...) ARG_T(ARG_N(__VA_ARGS__))
完整的宏如下
#define ARG_T(t) t //解决VC编译错误#define ARG_N(a1,a2,a3,N,...) N //截取并返回第四个参数,这里限制了可变参数计算的范围[1,3]#define ARG_N_HELPER(...) ARG_T(ARG_N(__VA_ARGS__)) //辅助宏#define COUNT_ARG(...) ARG_N_HELPER(__VA_ARGS__,3,2,1,0) //返回可变参数个数
示意代码
int main(){ int argn = COUNT_ARG(1,2,3); //argn值为3 return 0;}
0 0
- C/C++ 使用宏在编译期计算可变参数个数
- C可变参数个数
- C/C++可变参数宏, 编译期获取宏的可变参数长度
- (C++)使用模板在编译期计算阶乘
- C语言不定参数个数,可变参数函数使用学习
- C 参数可变宏使用
- iOS:在objective-c 使用可变参数
- iOS:在objective-c 使用可变参数
- C语言开发 -- 怎样写参数个数可变的宏
- 在编译期,获得函数参数个数
- C中的参数个数可变函数
- C 参数个数可变函数举例
- C中参数个数可变的函数
- c语言 参数个数可变函数
- C-可变参数个数函数的构建
- C可变参数宏
- C宏 可变参数
- 可变参数宏.c
- C++ primer 第五版 中文版 练习 10.34 个人code
- JAVA_形象生动的单例模式总结
- 斯诺登泄露文件:英美联手监听德国电信
- 使用setCustomView建立标题居中的自定义ActionBar
- Linker error
- C/C++ 使用宏在编译期计算可变参数个数
- Get the 48×48 or 256×256 icon of a file on Windows
- Cocos2d-x3.2 iOS下开启多点触控
- CentOS 打包压缩文件 zip 命令详解
- android平板上EditText总是自动弹出输入法问题
- webview setting movie path:程序崩溃
- 数据结构之线性表4单链表(静态单链表)
- linux文件系统与根文件系统
- SVN框架模式和运行分析理解 适合初学者