可变参数列表
2016-06-08 21:23
190 查看
一个函数在不同的时候接受不同数目的参数。
stdarg宏
可变参数列表是通过宏来实现的,这些宏定义于stdarg.h头文件中。这个头文件声明了一个类型va_list和三个宏---va_start,va_arg,va_end。
va_list用于声明变量的类型。
va_start准备访问可变参数。
va_arg用于访问参数列表的未确定部分。
va_end访问完毕最后一个可变参数后使用。
可变参数的限制
(1)可变参数必须从头至尾按顺序逐个访问。
(2)参数列表中的可变参数部分并没有原型,所以,所有作为可变参数传递给函数的值都将执行缺省参数类型提升。
(3)可变参数列表至少接受一个参数。如果连一个命名参数都没有,你就无法使用va_start。
(4)在va_arg中不许指定错误的类型,否则其结果是不可预测的。
可变参数的应用:
计算指定数量的值的平均值:
stdarg宏
可变参数列表是通过宏来实现的,这些宏定义于stdarg.h头文件中。这个头文件声明了一个类型va_list和三个宏---va_start,va_arg,va_end。
va_list用于声明变量的类型。
va_start准备访问可变参数。
va_arg用于访问参数列表的未确定部分。
va_end访问完毕最后一个可变参数后使用。
可变参数的限制
(1)可变参数必须从头至尾按顺序逐个访问。
(2)参数列表中的可变参数部分并没有原型,所以,所有作为可变参数传递给函数的值都将执行缺省参数类型提升。
(3)可变参数列表至少接受一个参数。如果连一个命名参数都没有,你就无法使用va_start。
(4)在va_arg中不许指定错误的类型,否则其结果是不可预测的。
可变参数的应用:
计算指定数量的值的平均值:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<stdarg.h> void my_printf(const char *str,int count,...) { int i = 0; va_list arg; va_start(arg,count); for(i = 0;i < count; i++,*str++) { char *a; char b = 0; int c = 0; switch(*str) { case 's': a = va_arg(arg,char *); while(*a) { putchar(*a); *a++; } break; case 'c': b = va_arg(arg,char); putchar(b); break; case 'd': c = va_arg(arg,int); c = c+'0'; putchar(c); break; default: putchar(*str); break; } } va_end(arg); } int main() { char *str = "d\nccc\ts"; int len = strlen(str); my_printf(str,len,1,'b','i','t',"welcome"); return 0; }
相关文章推荐
- 函数指针
- 静态顺序表
- 有两个链表a,b,设结点包括学号,姓名。从a链表中删去与b链表中有相同学号的那些结点。
- 160. Intersection of Two Linked Lists [easy] (Python)
- 厨房有约 | 华人生活馆HuarenStore官方博客
- 团队冲刺(二)个人工作总结7
- "二分法"-"折半法"-查找算法-之通俗易懂,图文+代码详解-java编程
- UIImagePickerController.h SDK 翻译
- jsp中tag自定义标签
- svn+teamcity+YouTrack+Upsource搭建—写给明天工作室的小伙伴
- C++符号优先级
- Linux 配置ip,远程,验证,运行,救援,相关
- 资源
- Android Studio中使用OpenCV Android SDK
- Design Compiler常用命令之时钟约束
- Android之GLES2.0画三角形测试代码
- 典型用户 - 场景(用户故事) - 任务 - 具体工作流程
- hdu 1077(单位圆覆盖问题)
- 颓废的一年
- 典型用户与场景