首先介绍四个东西:
- va_list
- va_start
- va_arg
- va_end
我先不说定义,先看例子。
如果我们有一个函数:
int sum(int i1, ...);
我要实现把给的所有参数相加,要怎么做呢?
显然,我们要知道每个参数的值。
问题是我们只能直接得到 i1 的值,后面的怎么办呢?
要获得值,本质上就是要获得它的地址对应的内容。
这个时候 va_start 闪亮登场。我们假设有 va_list ap;
,你不需要知道 va_list 是个什么东西。你只要知道 va_start (i1) 能让 ap 指向函数的第一个可变参数的地址。
有了地址,我们就能获取对应的内容。怎么做呢?这个时候可以用 va_arg (ap, int),它的作用就是提取 ap 对应地址的数据,并以 int 形式返回(其他类型同理)。我们只要接收这个函数的返回值即可。
不过,由于无法判断是否读完,我们得把 i1 改成 count,表示变量数量。
最后要做一点收尾工作。执行 va_end () 让 ap 指针归零。
我们最终的代码如下
#include <stdarg.h>
int sum(int count, ...)
{
va_list ap;
va_start(ap,count);
int sum = 0;
while (count > 0)
{
--count;
sum+=va_arg(ap, int);
}
return sum;
}
int main()
{
printf("%d\n", sum(5,1,2,3,4,5));
}