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
",args);
    printf("%d
",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()函数,但可以正常运行。

原文地址:https://www.cnblogs.com/lianwl/p/3426137.html