jw_lee

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

原来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;
}

 

 

posted on 2013-08-20 16:09  jw_lee  阅读(286)  评论(0编辑  收藏  举报