1.包含头文件 :<stdarg.h>,它声明了一种类型,并定义了(C89)几个宏:va_start, va_arg和va_end。C99中还增加了一个类似函数的宏va_copy。
2.要想获取可变参数。必须声明va_list类型的变量来接收可变参数。
va_list ap;
然后将这个“指针”指针到开头。即第一个可变参数:va_start(ap, n);这里的n为可变参数列表中的第一个参数的名字。
要想获取下一个可变参数,即可用:va_arg(ap, int)来获取,第二个参数为可变参数的类型,这个位置“指针”会自动向前到下一个参数处。
在函数返回之前,要求用语句va_end(ap);进行“清理”。(如果不返回,函数可以调用va_start并且再次遍历参数列表);
举个实际的例子:编写一个可变的参数列表的函数,求其最大值:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
int max_int(int n, ...);
int main(void)
{
int largest = max_int(1, 8, 2, 6, 4, 10, -1);
printf("max is %d\n", largest);
exit(EXIT_SUCCESS);
}
int max_int(int n, ...)
{
va_list ap;
int i;
int current;
int largest;
va_start(ap, n);
largest = n;
//这里判断!=-1,所以,在调用时,必须要以-1为结尾。呵呵。
while ( (current = va_arg(ap, int)) !=-1)
{
if ( current > largest )
{
largest = current;
}
}
va_end( ap );
return largest;
}
如果没有出现什么问题的话,会打印出: