?
?? ? ?众所周知,C语言的printf即实现了可变长度的参数,其实C语言标准库就已经提供了一个接口供我们使用,经之我们可以很简便的实现参数的可变长度参数。
?? ? ?通过查看C-API可以了解到这个
?
Macros:
va_start();
va_arg();
va_end();
Variables:
?? ? ??typedef va_list
?
?? ? ?其中va_start(),va_arg(),va_end()为三个宏定义方法,va_list为一个宏定义结构体,其具体实现均依赖于操作系统的实现,其声明如下
?
void va_start(va_list list, last_arg);
type va_arg(va_list list, type);
void va_end(va_list list);
?
?? ? ?va_start将第一个参数list初始化为...所代表的参数,从所给的last_arg参数处开始扫描(其实我觉得这个参数给得也没多大意义,不管你给得是哪个参数,都只扫描...所代表的参数)
?
va_arg自动迭代各个参数,类似于Java中的Iterator
va_end关闭这个list
?
list为自己定义的一个结构体
last_arg为传进来的参数中的最后一个
type为你想读取的参数的类型
?
?
下面以一个例子来进行演示
?
?
#include<stdarg.h> #include<stdio.h> //声明一个参数,第二个int为我所给出的last_arg void sum(char *, int,int, ...); int main(void) { sum("The sum of 15+13 is %d.\n", 11, 12, 15, 13); return 0; } void sum(char *string, int first_arg,int second_arg ...) { int sum = 0; va_list ap; int loop; /*注:这里若不是省略号前的第二个参数,则会出现警告信息 *所以下面这两行(我发现的)唯一的区别就是会不会出现警告*/ va_start(ap, second_arg); //va_start(ap, first_arg); /*注意下面这个2代表的是我有两个参数,通过这个来遍历*/ for (loop = 0; loop < 2; loop++) /*把list想像成一个栈,下面这个步骤就是弹出,也可以理解为迭代*/ sum += va_arg(ap, int); printf(string, sum); va_end(ap); }
?
?? ? ?注意上面的程序中那个循环,或许你会说那个2是不就是建立在我已经获悉有几个参数了吗。的确如此,不过可以解析后面的参数以获取有几个参数或者要求用户输入参数的个数(作为last_arg),这里我只是演示一下其运行机制罢了,更深一部的应用可以根据需要进行相应的扩展。