这里只是简单的描述一下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个参数的平均值。代码如下:
参考文献:《C和指针》
yhmcjc_804203354 2011-5-23 12:35