是通过
var_list
以及
var_start,var_arg,var_end
实现的。
前者是个指针类型,后3者是个宏。


原理就是,编译器会把参数从右至左压栈,
且内存空间连续。
因此只需找到这块内存空间的首地址(var_start),
然后每读一个参数,加上这个参数在内存中占的大小(var_arg),
就是下一个参数的地址,这样就能依次得到每一个参数。
看个例子:
int sum(int data,...)
{
int i=data,s=0;
va_list vl;
va_start(vl,data);
while(i!=-1)
{
s+=i;
i=va_arg(vl,int);
}
va_end(vl);
return s;
}
...
int s=sum(1,2,3,4,5,-1);
...
va_list vl;就是一个char *指针。
va_start(vl,data);就是取到data之后的参数,也就是可变参数的首地址。
va_arg(vl,int);,从当前内存位置取一个int类型的参数,并把指针后推相应距离。
va_end(vl);就是把用完的指针置0
以上都可以根据相应的定义直接看出来~
参考资料:
解析可变参数函数的实现原理(printf,scanf)