C语言-菜鸟打怪升级之路-可变参数列表

来源:互联网 发布:泉方pubmed数据库 编辑:程序博客网 时间:2024/06/05 08:54

很多新手和我一样看到标题肯定会疑惑,什么是可变参数列表?那么先来看看下面这个函数

float average( int num, int v1, int v2, int v3, int v4, int v5, int v6)

{

}

代码块内(所谓代码块即函数大括号内部区域)的内容我们暂且忽略,上面这个函数是一个计算6个数平均值的函数。其问题也是显而易见,即我要算4个数的平均值怎么办?如果按照上面的写法,那就重新写一个函数float average( int num, int v1, int v2, int v3, int v4),那计算7个数平均值呢,100个数的平均值呢?这种方法的局限性已经非常明显了,这个程序显然是不可移植的,因为以上函数只能接受固定数量的参数。那么在不同的时候函数接受不同数目的参数是不是可以呢?答案是肯定的,这就是所谓的可变参数列表。

可变参数列表通过宏来实现,宏定义在stard.h中,我们要用到的仅仅是一个类型va_list和三个宏va_start、va_arg和va_end  接下来看看如何使用。

#include <starg.h>  //首先需要用到这个头文件

float average( int num,  ...)  //你没有看错 ,那是省略号, 这种用法是合法的

{

va_list arg; //先申请一个va_list类型的变量

int i = 0;

float sum = 0;

va_start( arg,  num );//通过这个宏函数初始化va_list类型的变量arg,传入参数为变量arg和...的前一个形参即num

for ( i = 0; i < num; i ++ )

{

sum += va_arg(arg,int );//这个宏函数传入参数为变量arg,以及该变量类型

}

va_end(arg);//完成处理可变参数

ruturn sum / num;

}

以上的函数可以轻松处理不同个数参数的平均值。

注意:va_arg无法正确识别作用可变参数之上的缺省类型提升。



2017/8/24



原创粉丝点击