我们非常熟悉的printf
函数就是一种变长参数,简化版本的函数原型即为:
int printf(const char * _Format, ...);
其中,第一个参数即为必须指定的格式字符串,后面的省略号表示数量不定的参数列表。
使用上面提到的三个点表示的省略号即可达到定义一个变长参数的函数的目的,但是函数中如何取出这里面的所有参数呢?
这里要使用到C语言中解决变长参数问题的若干宏定义va_start
、va_arg
、va_end
,他们均定义在stdarg.h
头文件中,以va开头(表示variable-argument可变参数),可根据预先定义的系统平台自动获取相应平台上各个数据类型的偏移量。他们的使用方法为:
va_list ap; //定义一个可变参数列表ap
va_start(ap, arg); //初始化ap指向参数arg的下一个参数
va_arg(ap, type); //获取当前参数内容并将ap指向下一个参数
va_end(ap); //释放ap
首先定义一个va_list
类型的变量ap
,然后使用va_start
初始化这个变量。初始化之后,ap即指向了参数arg后面的第一个参数,即不确定参数中的第一个。然后使用va_arg
可以取出当前ap指向的这个参数的数值,并把ap指向了下一个参数,不断的进行这个操作可以取出变长参数中的所有参数。最后使用va_end
清空这个变长参数列表。