可变参数列表

来源:互联网 发布:双11京东和淘宝 编辑:程序博客网 时间:2024/05/16 06:43

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