C语言可变参数列表通过宏来实现,这些宏定义在stdarg.h头文件中,是标准库中的一部分。stdarg.h头文件声明了一个类型va_list和三个宏——va_start,va_end和va_arg。通过声明一个va_list类型的变量与这几个宏配合使用,访问参数的值。
可变参数列表位于一个或多个普通参数的后面,在函数原型中用一个省略号表示。
va_list类型的变量通过va_start来初始化,va_start有两个参数,第1个参数是va_list类型的变量,第2个参数是省略号前最后一个有名字的参数。初始化过程把va_list类型的变量设置为指向可变参数部分的第1个参数。va_arg宏接受两个参数:va_list类型的变量和参数列表中下一个参数的类型。va_arg返回当前参数的值,并使va_list类型的变量指向下一个可变参数。当访问完最后一个可变参数后,需要调用va_end。
可变参数只能从头到尾按顺序访问。由于可变参数列表部分没有原型,所以,作为可变参数传递函数的值都将执行缺省的参数类型提升。参数列表中至少要有一个命名参数,否则无法使用va_start。
简单示例:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
int sum(int n, ...) {
va_list arg;
int count;
int s = 0;
va_start(arg, n);
for (count = 0; count < n; ++count) {
s += va_arg(arg, int);
}
va_end(arg);
return s;
}
int main(void) {
int a = 1;
int b = 2;
int c = 4;
int d = 8;
printf("sum = %d\n", sum(4, a, b, c, d));
return EXIT_SUCCESS;
}
结果输出:
sum = 15