C++ 中可变参数的函数有两种类型:
type func(...)
type func(type,...)
可变参数顾名思义就是函数的参数数目或者类型是不确定的,对于这种该如何获取传递的参数的值,这就需要对C,C++的函数栈结构有一定的了解。下面就直接进入实战分析:
#include<iostream>
#include<cstdarg>
using namespace std;
void func(...);
void func2(intnfirst,...);
void main()
{
cout<<"Thisis func:"<<endl;
func(1,2,3,5,6,-1);
cout<<"Thisis func2:"<<endl;
func2(0,7,4,-1);
}
void func(...)
{
va_list list;
va_start(list,list);
list = list + 12; //只 所¨ 以° 加¨ 12的 原-因°¨°从 ¨ 临 ¨ 时 变 量 地 址 ¤到 第 ¨ 一° 个 参 数 y之 间 有 D12个 字 节¨ 。 ê
int n =0;
std::cout<<n<<endl;
while(n!= -1)
{
n = va_arg(list,int);
std::cout<<n<<endl;
}
va_end(list);
}
void func2(intnfirst,...)
{
va_list list;
va_start(list,nfirst);
int n =0;
while(n!=-1)
{
n = va_arg(list,int);
std::cout<<n<<endl;
}
}
函数的运行结果:
关于可变参数的剖析,步骤
头文件 #include<cstdarg>
宏定义 va_list,va_start,va_arg,va_end
步骤:
1 va_list ap
标识一个数据结构,ap用来存放可变参数信息。
2 va_start(ap,v);
这个宏用来初始化可变参数列表。ap表示初始化的数据结构,它里面存放着后面的可变参数信息。 v标识函数声明中最后一个具有名字的参数,也就是...之前的那个参数。
3 va_arg(ap,t);
获取可变参数,t是参数的类型。用这个函数来获取后面的可变参数的值。
int xx;
xx = va_arg(ap,int);