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宏。
例:
从这个例子可以知道,可变参数是有限制的:
1、可变参数必须从头到尾逐个顺序的访问,可以访问几个变量后终止,但是不可以从一开始就访问中间的变量。
2、参数列表中至少要有一个命名参数,因为要使用va_start宏进行初始化。
3、这些宏无法判断实际存在参数的数量。
4、这些宏无法判断每个参数的类型。
在C语言中使用可变参数列表最好的一个例子就是printf函数,该函数的命名参数就是格式化字符串,同时在格式化字符串中提供了后面可变参数的类型。
在使用可变参数列表需要注意的是如果在va_arg宏指定了错误的类型,其结果是不可预知,因为数据的本质都是二进制码,指定不同的类型只是访问时系统以不同的指令进行访问。并且char、short和float类型的值实际上将作为int或double类型的值传递给函数,因为va_arg宏无法准确识别作用于可变参数之上的缺省参数类型提升。