Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4145
  • 博文数量: 7
  • 博客积分: 135
  • 博客等级: 入伍新兵
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-21 13:35
文章分类

全部博文(7)

文章存档

2011年(7)

我的朋友
最近访客

分类: LINUX

2011-11-14 14:00:17

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) |
0

上一篇:About Qualcomm processor

下一篇:没有了

给主人留下些什么吧!~~