原来C语言还支持函数传递数目不定的参数。printf函数是不是依此实现的呢?
实现方法
1.包含宏头文件
#include<stdarg.h>
2.函数原型中参数的写法
参数数目未定,名称也未定。用...来代替未定数目的参数,但第一个参数名一定要写。如
int max_list( int num, ... );
float average( int n_value, ... );
3.引用参数
首先要定义一个 va_list 类型的变量,用于访问参数列表的未确定部分,如
va_list var_avg;
然后初始化
va_start( var_avg, num );
第一个参数是之前声明的 va_list 类型的参数,第二个是传递给函数的省略号前的最后一个参数。
初始化后,var_avg就代表了可变参数部分的第一个参数,即省略号部分的参数,不包括声明了的那些参数。
要引用参数时就用va_arv( var_avg, int );
没引用一次后会自动指向下一个参数。
注意:
1.可变参数必须从头到尾按顺序逐个访问
2.所有作为可变参数传递给函数的值都将执行缺省参数类型提升,无法判断每个参数的类型。
3.参数列表至少要有一个命名参数。
4.无法判断实际存在的参数的数量。
例程:查找未定数目参数中最大的一个并返回
#include<stdio.h> #include<stdarg.h> int max_list( int num, ... ); int main(){ int test_max = 0; test_max = max_list( 13, 5, 0, 9, 8, 1, 6, 4, -1); printf( "%d",test_max ); return 0; } int max_list( int num, ... ){ va_list var_avg; int n_tmp; int n_max = num; va_start( var_avg, num ); while( ( n_tmp = va_arg( var_avg, int ) ) >= 0 ){ if( n_max < n_tmp ){ n_max = n_tmp; } } return n_max; }