有的时候函数的参数个数在调用的时候才确定,这时函数的参数为可变参数
使用可变参数时用到的几个库函数:
void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
va_list类型的一个对象 定义: typedef char * va_list;
va_start:访问变长参数列表中的参数之前使用的宏,它初始化用va_list声明的对象,初始化结果供宏va_arg和
va_end使用;
va_arg: 展开成一个表达式的宏,该表达式具有变长参数列表中下一个参数的值和类型。每次调用va_arg都会修改
用va_list声明的对象,从而使该对象指向参数列表中的下一个参数;
va_end:该宏使程序能够从变长参数列表用宏va_start引用的函数中正常返回。
这三个库函数和变量va_list类型定义在c库:《stdarg.h>中定义
使用的基本格式为:
//包含头文件<stdarg.h>
#include <stdarg.h>
//可变参数函数定义时的可变参数用“...”表示
int func(int cnt, ...)
{
//定义一个va_list变量,用来取函数的可变参数
va_list var_arg;
/*函数的其他变量定义*/
//vabegin,取可变参数开始,第一个参数为自己定义的valist变量,第二个参数为函数可变参数的前一个显示定义的参数
//也就是告诉程序从函数参数的什么位置开始取可变参数
va_start(var_arg,cnt);
for(;va_cnt < cnt;va_cnt++)
{
//逐个取函数的可变参数,传入的参数类型为char *
type = va_arg(var_arg, type);
}
//结束可变参数获取
va_end(var_arg);
/*函数的处理*/
return 0;
}
示例程序:
#include <stdio.h>
#include <stdarg.h>
//可变参数函数定义时的可变参数用“...”表示
int func(int cnt, ...)
{
//定义一个valist变量,用来取函数的可变参数
va_list var_arg;
int va_cnt=0;
char *pChar;
//vabegin,取可变参数开始,第一个参数为自己定义的valist变量,第二个参数为函数可变参数的前一个显示定义的参数
//也就是告诉程序从函数参数的什么位置开始取可变参数
va_start(var_arg,cnt);
for(;va_cnt < cnt;va_cnt++)
{
//逐个取函数的可变参数,传入的参数类型为char *
pChar = va_arg(var_arg, char *);
puts(pChar);
}
//结束可变参数获取
va_end(var_arg);
return 0;
}
int main(int agc, char **argv)
{
char *pChar = "hello variable argument 1";
puts("------call func with 3 arguments------");
func(2,pChar,"hello variable argument 2");
puts("------call func with 4 arguments------");
func(2,pChar,"hello variable argument 2","hello variable argument 3");
return 0;
}
运行结果:
------call func with 3 arguments------
hello variable argument 1
hello variable argument 2
------call func with 4 arguments------
hello variable argument 1
hello variable argument 2
hello variable argument 3