您的位置:首页 > 编程语言 > C语言/C++

C语言可变参函数的实现原理浅析

2016-02-06 13:19 323 查看
先看一下可变参函数的使用:

int add(int n,...)

{
int i=0;
int result=0;
va_list arg=NULL;
va_start(arg,n);
for(;i<n;++i)
{
result+=va_arg(arg,int);
}
va_end(arg);
return result;

}

int main()

{
printf("%d\n",add(4,11,22,33,44));

}

以上是利用可变参函数求几个数的和的程序。从以上例子可以看到,可变参函数最大的特点就是参数的个数不确定,但可以正确的得到结果。下面看看可变参的实现原理吧。

参数在内存中的布局是这样的:

c语言默认的调用约定是__cdcel,参数从右往左进栈,在栈中也是连续的,所以只要知道了可变参的前一个参数,就可以得到下一个参数。上面的实现方式传进去了第一个参数,这个参数是所有参数的个数,所以程序就可以依次取出所有的参数了。下面看看可变参里几个宏定义的实现:

#define va_list void*

//让arg指向第一个参数的下一个位置,第一个参数是个数,也是开始位置

#define va_start(arg,n) (va_list)arg = (va_list)(((char*)&n)*sizeof(n))  

//首先得到arg指向的内容,并让arg指向下一个参数,用当前参数的地址加上当前参数数据类型的大小

#define va_arg(arg,type) *((type*)arg); arg = ((char*)arg)+sizeof(type);

#define va_end(arg)          
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: