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;
}
上一篇:Echarts通过Ajax实现动态数据加载


下一篇:stdarg宏与实现stm32printf串口打印