C中解决变参问题—VA_LIST
2011-03-29 14:44
281 查看
VA_LIST是C语言中解决变参问题的一组宏。头文件来自stdarg.h。
查看linux系统源码方式我一般用locate stdarg.h,然后找到提示目录vi进去。源文件定义是:
va_list 是一个字符指针,可以理解为指向当前参数的一个指针,取参必须通过这个指针进行。在调用参数表之前,应该定义一个 va_list 类型的变量 args;然后通过va_start对 args 进行初始化,让它指向可变参数表里面的第一个参数,第一个参数是 args 本身,第二个参数是在变参表前面紧挨着的一个变量;然后是获取参数,调用 va_arg,它的第一个参数是 args,第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值,并且把 args 的位置指向变参表的下一个变量位置;获取所有的参数之后,我们有必要用va_end将这个 args 指针关掉,以免发生危险,他是输入的参数 args 置为 NULL。
实例:
VA_LIST几个注意问题:
可变参数的类型和个数完全由程序代码控制,它并不能智能地识别不同参数的个数和类型;
如果我们不需要一一详解每个参数,只需要将可变列表拷贝至某个缓冲,可用vsprintf函数;
因为编译器对可变参数的函数的原型检查不够严格,对编程查错不利.不利于我们写出高质量的代码。
我们这里结合vfprintf()使用。vfprintf()会根据参数format字符串来转换并格式化数据,然后将结果输出到参数stream指定的文件中,直到出现字符串结束(‘\0’)为止。
我们打开va_log文件:
查看linux系统源码方式我一般用locate stdarg.h,然后找到提示目录vi进去。源文件定义是:
va_list 是一个字符指针,可以理解为指向当前参数的一个指针,取参必须通过这个指针进行。在调用参数表之前,应该定义一个 va_list 类型的变量 args;然后通过va_start对 args 进行初始化,让它指向可变参数表里面的第一个参数,第一个参数是 args 本身,第二个参数是在变参表前面紧挨着的一个变量;然后是获取参数,调用 va_arg,它的第一个参数是 args,第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值,并且把 args 的位置指向变参表的下一个变量位置;获取所有的参数之后,我们有必要用va_end将这个 args 指针关掉,以免发生危险,他是输入的参数 args 置为 NULL。
实例:
VA_LIST几个注意问题:
可变参数的类型和个数完全由程序代码控制,它并不能智能地识别不同参数的个数和类型;
如果我们不需要一一详解每个参数,只需要将可变列表拷贝至某个缓冲,可用vsprintf函数;
因为编译器对可变参数的函数的原型检查不够严格,对编程查错不利.不利于我们写出高质量的代码。
我们这里结合vfprintf()使用。vfprintf()会根据参数format字符串来转换并格式化数据,然后将结果输出到参数stream指定的文件中,直到出现字符串结束(‘\0’)为止。
我们打开va_log文件:
相关文章推荐
- VA_LIST 是在C语言中解决变参问题的一组宏
- C语言中: va_list 解决变参问题
- 解决变参数问题:va_list、va_start、vsnprintf、va_end的使用方法和实例
- va_list-关于方法变参的问题
- va_list解决c中变参问题
- /usr/bin/zcat: Argument list too long问题解决
- mybatis关联查询一对多问题解决,将表中对应的多条数据以list形式存储
- 关于linux环境下配置solr6.3.0的welcome-file-list标签不生效问题解决办法
- Android环境搭建问题的解决:Failed to fetch URL http://dl-ssl.google.com/android/repository/addons_list-1.xml,
- 利用redis的list队列解决类似微博中msgbox表的性能问题
- List的add()覆盖了前面的所有元素问题解决
- List<Object>集合按照Object的某个字段排序,解决取不到父类字段问题
- Java 数组转换成List,然后执行add或remove抛异常UnsupportedOperationException问题的解决
- 快速解决Python问题:TypeError: list indices must be integers or slices, not str
- 在Markdown中紧跟list列表后的四空格缩进代码被错误解析问题与解决方法
- 解决 ”不允许在查询中显式构造实体类型“问题及使用其他方法实现返回 List<Model对象>或者IQueryable<Model对象>对象
- Android studio Cannot reload AVD list问题解决
- DataGridView 绑定List 时 排序问题的解决
- 对*** glibc detected *** ./avdecc_ctl: corrupted double-linked list: 0xb520072的问题的解决
- Mybatis返回list排序无效问题解决方法