C和C指针小记(十二)-函数的可变参数表

1、可变参数表是通过宏实现的

宏定义于stdarg.h头文件,它是标准库的一部分.这个头文件声明了一个类型var_list和三个宏--va_start、va_arg、va_end.

我们可以声明一个类型为va_list的变量,与这几个宏配合使用,访问参数的值.

参数列表在函数中用三点省略号(...).它表示此处可能传递数量和类型未定的参数.函数原型和函数的定义都要这样做.

函数中要声明一个名叫 va_arg 的变量,它用于访问参数列表的未定部分.这个变量通过调用va_start来初始化.它的第一个参数是var_list变量的名字.第2个参数是省略号前最后一个有名字的参数.初始化过程把va_arg变量设置为指向可变参数部分的第一个参数.

为了访问参数,需要使用,va_arg,这个宏接收两个参数:va_list变量和参数列表中下一个参数的类型.在这个例子中,所有的可变参数都是整型.在有些函数中,你可能要通过前面获得的数据来判断下一个参数的类型. va_arg返回这个参数的值,并使var_arg指向下一个可变参数.

最后,当反问完毕最后一个可变参数之后,我们需要调用va_end;

2、可变参数的限制

可变参数必须从头祷文按照顺序逐个访问.可以访问到一半终止,但是不可以一开始就访问参数列表中间的参数.
由于参数列表中的可变参数部分并没有原型,所以所有作为可变参数传递给函数的值都将执行缺省参数类型提升.
/**
可变参数的定义,求平均值 @param n_values 参数表中参数的个数
@param ... 可变参数表
@return 平均值
*/
float average(int n_values, ...){
va_list var_arg;
int count;
float sum = 0;
//准备访问可变参数
va_start(var_arg, n_values);
//添加取自可变参数列表的值
for (count = 0; count < n_values; count += 1) {
sum += va_arg(var_arg, int);
}
//完成处理可变参数
va_end(var_arg);
return sum/n_values;
}
上一篇:PHP苹果推送实现(APNS)


下一篇:Winform调用QQ发信息并且开机启动 (开源)