用C语言实现拥有变长参数列表的函数,由于参数是顺序压栈的,所以可以由程序员自己利用指针取到每一个参数
void args_func( Type *arg0, ... )
{
Type *ap;
ap = ((Type *)&arg0) + sizeof(arg0);//取得栈顶地址加最后一个固定参数的地址偏移,得到第一个不定参数的地址
ap = ap + sizeof(type); //根据约定的不定参数类型取得下一个参数,每调用一次该句,取到下一个参数
...
}
变长参数列表至少有一个必有的参数,不能全部参数都为可选参数
在C语言里可以利用已定义好的一系列宏来实现变长参数:
#include<stdarg.h>//包含头文件
//假设有n个类型为Type的参数
void arg_func(int n,...)
{
int i;
Type temp;
va_list ap;//定义一个 va_list类型的变量ap
va_start(ap,int);//初始化ap,使其指向最后一个必选参数
for(i=0;i<n;i++)
temp = va_arg(ap,Type);//顺次取得所有参数
va_end(ap);
}