您的位置:首页 > 其它

可变参数列表

2010-10-12 16:38 204 查看
C语言中可变参数列表是通过宏来实现的,这些宏包含在stdarg.h头文件中,该头文件定义了va_list类型和三个宏:va_start、va_arg、va_end。用法:首先声明一个va_list类型的变量,使用va_start宏进行初始化,va_start宏的第一个参数是该va_list类型的变量,第二个参数是非可变参数的最后一个参数,在访问可变参数时使用va_arg宏,该宏的第一个参数是va_list变量名第二个参数是参数列表中下一个参数的类型。va_arg宏返回该参数的值,并使变量指向下一个可变参数。当访问完最后一个参数之后,需要调用va_end宏。

例:

/*求平均数,n_values表示变量的个数*/float average( int n_values, ... ){va_list var_arg;int count;float sum = 0;/*初始化变量*/va_start( var_arg, n_values );for( count = 0; count < n_values; count++ ){sum += va_arg( var_arg, int );}        /*结束访问*/va_end( var_arg );return sum/n_values;}


从这个例子可以知道,可变参数是有限制的:

1、可变参数必须从头到尾逐个顺序的访问,可以访问几个变量后终止,但是不可以从一开始就访问中间的变量。

2、参数列表中至少要有一个命名参数,因为要使用va_start宏进行初始化。

3、这些宏无法判断实际存在参数的数量。

4、这些宏无法判断每个参数的类型。

在C语言中使用可变参数列表最好的一个例子就是printf函数,该函数的命名参数就是格式化字符串,同时在格式化字符串中提供了后面可变参数的类型。

在使用可变参数列表需要注意的是如果在va_arg宏指定了错误的类型,其结果是不可预知,因为数据的本质都是二进制码,指定不同的类型只是访问时系统以不同的指令进行访问。并且char、short和float类型的值实际上将作为int或double类型的值传递给函数,因为va_arg宏无法准确识别作用于可变参数之上的缺省参数类型提升。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: