首页 > 学院 > 开发设计 > 正文

C可变长实参列表

2019-11-11 01:39:29
字体:
来源:转载
供稿:网友

C语言允许创建一个接收实参个数不确定的函数。例如PRintf就可以接收任意数目的实参。若要声明一个参数个数不确定的函数,可将省略号(…)放在函数原型的形参列表末尾,用于表示这个函数可以接收可变数目的各种类型的实参。如下:

int printf(const char *format, ...);

可变实参头文件stdarg.h中的宏和定义,为创建一个可变长实参列表的函数提供了必需的功能。如下:

va_list 适用于保存va_start、va_arg和va_end所需的信息。为了访问到一个可变长实参列表中的实参,必须定义一个类型为va_list的变量va_start 在一个可变长实参列表中的实参被访问之前,先调用这个宏,初始化用va_list声明的对象以便让va_arg和va_end来使用va_arg 这个宏展开成一个表示可变长实参列表中下一个实参的值和类型的表达式。每次对va_arg的调用都要修改用va_list声明的对象,以使这个对象指向列表中的下一个实参va_end 当一个函数的可变长实参列表是由va_start来引用时,宏va_end可用于从这样的函数中正常返回

宏va_start接受两个实参,一个是va_list声明的对象,另一个是实参列表中在省略号前的最右边的标识符。 宏va_arg接受两个实参,一个是va_list声明的对象,另一个是期望在实参列表中出现的数据的类型,宏va_arg返回的是实参的值。 宏va_end接受一个实参,即va_list声明的对象,以便调用的函数正常返回。 例如下:

#include <stdio.h>#include <stdarg.h>double average(int i, ...);int main(int argc, char const *argv[]){ //average(4, 3, 1, 2, 2); printf("%f/n", average(4, 3.0, 1.0, 2.0, 2.0)); return 0;}double average(int i, ...) { va_list args; va_start(args, i); int counter = 0; double sum = 0; for (; counter < i; counter++) { sum += va_arg(args, double); //printf("%d/n", va_arg(args, int)); } va_end(args); return sum / i;}
上一篇:TreeSet

下一篇:网络爬虫爬取小说3

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表