C语言中的可变参数列表
Linux-0.11源码中init/mian.c文件中定义了printf()函数,这个函数的参数包含了可变参数列表。以前没太注意过可变参数列表,所以这个地方没看懂,所以拿过来K&R翻了翻,找到了答案。
这是我写的测试函数:
/************************************************************************* > File Name: args_list.c > Author:qusijun > Mail: wiilen.lian@gmail.com > Created Time: 2013年11月15日 星期五 21时16分25秒 ************************************************************************/ #include<stdio.h> #include<stdarg.h> void print_args(int args, ...) { va_list ap; //在访问任何未命名的参数之前,必须用va_start宏初始化ap一次 va_start(ap,args); printf("%d\n",args); printf("%d\n",va_arg(ap,int)); printf("%s",va_arg(ap,char *));
va_end(ap); } int main(void) { int arg = 2; int args1 = 1; char *args2 = "lianwenlong"; print_args(2,args1,args2); return 0; }
看看K&R中是怎么说的:
头文件<stdarg.h>提供了遍历未知数目和类型的函数参数列表的功能。
假定函数f带有可变数目的实际参数,lastarg是它的最后一个命名的形式参数,那么,函数f内声明一个va_list的变量ap,它将依次指向每个实际参数:
va_list ap;
在访问任何未命名的参数前,必须用va_start宏初始化ap:
va_start(ap,lastarg);
此后,每次执行宏va_arg都将产生一个与下一个未命名的参数具有相同类型和数值的值,它同时修改ap使得ap指向下一个参数:
type va_arg(arg,type);
在所有的参数处理完毕之后,且在退出函数f之前,必须调用宏va_end一次:
va_end(ap);
ps:我一开始的测试函数中并没有调用va_end()函数,但可以正常运行。