VA_ARG宏的实现
来源:互联网 发布:linux mint 17 输入法 编辑:程序博客网 时间:2024/06/05 17:36
_ARG宏VA_ARG宏_ARG宏的实现
#define va_arg(ap,t) (*(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
这个宏做了两个事情,
①用用户输入的类型名对参数地址进行强制类型转换,得到用户所需要的值
②计算出本参数的实际大小,将指针调到本参数的结尾,也就是下一个参数的首地址,以便后续处理。
VA_ARG宏
获取可变参数的当前参数,返回指定类型并将指针指向下一参数(t参数描述了当前参数的类型):
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) -_INTSIZEOF(t)) )
( *(t *) ( (ap += __INTSIZEOF(t)) - __INTSIZEOF(t)) )
①
① 该处表达式等于ap=ap+_INTSIZEOF(t) 即ap指向了下一个可变参数的首地址,ap的值发生了改变;
② 第二步做 [ ap=ap+_INTSIZEOF(t)]-_INTSIZEOF(t) 这样 ap的值虽然发生了改变,但这个表达式的值还是ap原来的地址值
③ 第三步 (t *)先进行强制类型转换转换为 t 类型的指针之后,再做*(t*)即将地址强制类型转换为 t 类型后,再取该地址中的内容;
④ 经过这三步 VA_ARG宏 便实现了
a.获取可变参数的当前参数
b. 返回指定类型并将指针指向下一参数
总结:从上述过程可知VA_ARG宏 是先将ap指向下一个参数后,再获取当前参数
- VA_ARG宏的实现
- 宏:va_list、va_start、va_arg、va_end的使用
- 宏:va_list、va_start、va_arg、va_end的使用
- va_list、va_start、va_arg、va_end宏的学习
- va_list、va_start、va_arg、va_end宏的使用方法
- va_list、va_start、va_arg、va_end宏的使用
- va_start, va_arg, va_end 宏的学习
- va_start(), va_arg(), va_end() 宏定义的解释
- va_arg ()
- va_arg
- va_arg
- va_arg
- va_list、va_start、va_arg、va_end宏的使用(转)
- va_list、va_start、va_arg、va_end宏的使用(转)
- va_list、va_start、va_arg、va_end宏的使用(转)
- [C++]va_list、va_start、va_arg、va_end宏的使用
- va_start,va_arg,va_end的用法
- va_start va_end va_arg的用处
- 几款好用的滤波器设计软件
- 设置组件状态--如何动态关闭manifest中的Receiver
- 织梦系统编程收集
- Extjs的打印解决方案
- JS正则表达式大全
- VA_ARG宏的实现
- hibernate namequery in 参数的设置
- jQueryEasyUI Messager基本使用
- linux下查看用户及用户组的命令
- SharePoint 批量打包zip下载列表项ListItem附件
- Objective-C计数器疑问
- Link Collect
- RT3070驱动移植
- Android获取SD卡上的APK文件,并且判断是否安装过、是否可以更新到新版本的工具类