asmlinkage int printk(const char *fmt, ...)
int sum(int num, ...)
这几个宏 va_list va_start,va_arg,va_end
其原理就是,
1. 函数调用照常入栈
2. 通过va_start得到fmt后第一个参数的地址
3. 通过va_arg取得之后的一个又一个的参数,这是需要之后每个参数的type的
4. va_end,清空
所以,利用va_list va_start va_arg va_end可以实现变参。printk是典型应用。
下面是个例子
#include
#include
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 main()
{
int s=sum(1,2,3,4,5,-1);
printf("sum = %d\n",s);
return 0;
}
阅读(253) | 评论(0) | 转发(0) |