C语言 可变参数函数总结
2016-07-17 02:41
330 查看
1.可变参数函数
可变参数函数,顾名思义,即函数的参数个数是可变的,例如 printf 的函数原型是:int printf ( const char * format, ... );
可变参数函数的声明形式基本类似:只是在参数列表最尾部有一个参数 format 和 一个可变参数标志(三个点“…”)
2.相关的宏
在实现可变参数函数时,通常会用到以下几个宏:void va_start(va_list ap, argN); type va_arg(va_list ap, type); void va_end(va_list ap); void va_copy(va_list dest, va_list src);
使用这些宏需要包含头文件 stdarg.h。
在上述宏中:
va_list:用于遍历可变参数列表的变量类型
va_start:初始化 va_list 类型的对象 ap,使其指向调用 va_arg 之前的参数列表起始处
va_arg:返回 ap 指向的参数列表中的下一个参数,且每次调用 va_arg 都会修改 ap 使其指向下一参数,使得参数能依序返回
va_end:用于清理工作,使 ap 失效
va_copy:用于拷贝 va_list 的内容
在操作可变参数列表之前,必须先调用宏 va_start 或者 va_copy。
3.一个例子
以下是 execl 的一个可能的实现:#include <stdarg.h> #define MAXARGS 31 /* * execl is called by * execl(file, arg1, arg2, ..., (char *)(0)); */ int execl(const char *file, const char *args, ...) { va_list ap; char *array[MAXARGS +1]; int argno = 0; va_start(ap, args); while (args != 0 && argno < MAXARGS) { array[argno++] = args; args = va_arg(ap, const char *); } array[argno] = (char *) 0; va_end(ap); return execv(file, array); }
在上述实现中,使用一个空指针来标志参数列表的末尾,而在其他一些函数中,可以使用格式化字符串来明确参数个数或者在尾端加上一个特定的参数作为标志。
4.注意事项
调用变参函数时,传递的变参数目应不少于该函数所期望的变参数目(该数目由主调函数实参指定或由变参函数内部实现决定),否则会访问到函数参数以外的堆栈区域,可能导致堆栈错误。va_arg(ap, type) 宏获取变参时,type 不可指定为以下类型,原因与默认参数提升有关:
char、signed char、unsigned char
short、unsigned short
signed short、short int、signed short int、unsigned short int
float
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Lua和C语言的交互详解
- Lua编程示例(一):select、debug、可变参数、table操作、error
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C 语言简单加减乘除运算
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总
- C语言判断一个数是否是2的幂次方或4的幂次方
- C语言二进制思想以及数据的存储