在函数原型中,列出了函数期望接受的参数,但是原型只能显示固定数目的参数,让一个函数在不同的时候,接受不同的数目的参数是不是可以的,答案是肯定的。
stdarg宏
可变参数列表是通过宏来实现的,这些宏是定义在stdarg.h头文件中,它是标准库的一部分,这个头文件声明了一个类型为va_list和三个宏-va_start,va_srg,va_end,我们可以声明一个类型为va_list的变量,与这几个宏配合使用,以访问参数的值,
在可变参数列表中会有省略号来标记这是可能传递数量和类型未确定的参数,在编写这个函数的原型时,也要使用相同的标法。
函数声明了一个名为va_arg的变量。它用来访问参数列表的未确定的部分,这个变量通过调用va_start来初始化,它的第一个参数是va_list变量的名字,第2个参数是省略号前最后一个有名字的参数,初始化过程把var_arg变量设置为指向可变参数部分的第一个参数,
为了访问这个参数,需要使用va_arg,这个宏接受两个参数,va_list变量,和参数列表中下一个参数的类型,在这个例子中,所有的可变参数都是整型,在有些函数中,你可能要通过前面获得的数据来判断下一个参数的类型,va_arg返回这个参数的值,并使var_arg指向下一个可变参数。
最后,当访问完毕最后一个可变参数之后,我们需要调用va_end
#include<stdarg.h>
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++)
{
sum+=va_arg(var_arg,int);
}
/*完成处理可变参数*/
va_end(var_arg);
return sum/n_values;
}