您的位置:首页 > 编程语言 > C语言/C++

C语言中的可变参数列表

2013-11-15 21:52 330 查看
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()函数,但可以正常运行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: