先说明规则:
1.函数的可变参数中必须有一条确定的参数(至少一条);
2.可变参数列表必须从头开始访问,访问到尾部;
3.可变参数列变不能确定参数数目;(编译时才能确定)
4.可变参数的变量类型是不确定的,编译时必须确定参数类型,变量的参数类型不确定时,函数的结果未知。
参数使用方法:
#include <stdarg.h>
va_list argp; //这里取得参数列表;
va_statrt(argp,str); //使用va_start来得到参数列表的指针,用于指向第一个参数
va_arg(argp,int); //使用va_arg()函数,返回参数的值,然后指针指向下一个参数;
va_end(argp); //使用va_end()函数,将argp中的参数置空;
我认为函数的可变参数有两种使用方法:
1.最少需要一个参数,用这个参数来指定参数列表的长度;
比如:fun(int num,…) 在这里用num来确定参数的各数
使用时用for循环,依次读入参数,请看下面的实例:
// main.c
int sum(int num,...);
sum(10,1,2,3,4,5,6,7,8,9,10);
//函数定义
int sum(int n,...)
{
int sum = 0;
int i = 0;
va_list list;
va_start(list,n);
for(i = 0; i < n;i++)
{
sum+= va_arg(list,int);
}
va_end(list);
return sum;
}
2.设置一个标记位,用来结束while循环,也被称之为哨兵
main.c
print("start","ABC","DEF","CBA","");
这里的“”空字符串就起到了哨兵的作用,用于跳出while循环
//函数定义
void print(char* str,...)
{
va_list list;
va_start(list,str);
char* para;
while(1)
{
para = va_arg(list,char*);
if(strcmp(para,"") == 0)
break;
cout << para << endl;
}
va_end(list);
}
整数的话,可以使用-1来跳出循环
使用函数时,printint(100,1,2,3,4,5,-1);
int printint(int max,...)
{
int temp;
int i = 0;
va_list args;
va_start(args,max);
while(1)
{
temp = va_arg(args,int);
cout << temp << " :" << ++i << endl;
if(temp == -1)
break;
cout << temp << "i get it" << endl;
}
va_end(args);
return temp;
}