可变参数函数的一个简单例子
这里只是简单的描述一下C语言中如何使用参数数量可变的函数,至于stdarg.h中关键宏如何实现以及编译器如何处理这些更底层的东西,以后再说。
我们知道,C语言中函数体包含三个要素:返回值类型、函数体、参数列表。其中参数列表一般情况下都包含个数及类型确定的参数信息,但是千万不要以为函数的参数就必须是个数确定的,其实我们每天都在用着这些例外的情况:printf(),scanf()..。这种函数的原型一般是ReturnType A (Type a,...Type b,...),第二个省略号即表示该函数参数个数为确定。那么如何在自己的代码中实现这种函数呢?
举个例子,我们想编写一个函数average(),该函数返回输入参数的平均值,但输入参数的个数是不确定的。我们通过使用stdarg.h中定义的一个数据类型va_list和三个关键宏va_start,va_arg和va_end来实现。其中va_list类型的变量用于访问参数列表中未确定的部分,这个变量通过va_start宏来初始化。该宏接受两个参数,第一个是该va_list类型的变量,第二个是省略号前面最后一个有名字的参数。初始化过程把var_list变量设置为指向可变参数部分的第一个参数。
为了在函数中访问未确定的参数部分,需要使用va_arg宏,该宏接受两个参数,第一个是前面已经被va_start宏初始化过了的va_list变量,第二个是参数列表中下一个参数的类型。
当访问完最后一个参数时,我们需要调用va_end宏。
最后给出一个实例函数 float average(int n_values,...),该函数接受一个确定参数和一个不确定参数列表。确定参数n_values表示未确定参数的个数,函数返回这些n_values个参数的平均值。代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdarg.h>
2 #include<iostream.h>
3 float
4 average(int n_values,...)
5 {
6 va_list var_arg;
7 int count;
8 float sum=0;
9
10
11 va_start(var_arg,n_values);
12
13 for(count=0;count<n_values;count++)
14 {
15 sum+=va_arg(var_arg,int);
16 }
17 va_end(var_arg);
18
19 return sum/n_values;
20 }
21
22 void main()
23 {
24 cout<<"1,2,3的平均值为:";
25 cout<<average(3,1,2,3)<<endl;
26
27 cout<<"1,2,3,4的平均值为:";
28 cout<<average(4,1,2,3,4)<<endl;
29
30 cout<<"1,2,3,4,5,6,7,8,9,10)的平均值为:";
31 cout<<average(10,1,2,3,4,5,6,7,8,9,10)<<endl;
32 }
参考文献:《C和指针》