Chinaunix首页 | 论坛 | 博客
  • 博客访问: 280376
  • 博文数量: 68
  • 博客积分: 3061
  • 博客等级: 中校
  • 技术积分: 652
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-27 11:39
文章分类

全部博文(68)

文章存档

2018年(1)

2017年(2)

2016年(1)

2014年(2)

2012年(6)

2011年(14)

2010年(38)

2008年(4)

我的朋友

分类: LINUX

2010-08-04 13:48:06

1.valist,va_start,va_end.

  valist 是由typdef 定义的 char *类型。

  va_start 是一个宏定义:
       #define va_start(ap, A)  (void) ((ap) = (((char *) &(A)) + (_bnd(A,_AUPBND))))  意思是将A地址偏移(_bnd(A,_AUPBND))个字节后付给ap。

  va_end 是一个宏定义:
        #define va_end(ap)              (void) 0

2. 函数参数的入栈
   arm函数调用规则可知:函数入栈顺序为,从右到左,test(a,b,c),在栈中的排列为:c(高地址), b,a(低地址)。

3. 方法
   结合上述两个点:在变长函数virfunctin(char *fmt, ...)中,应定义valist args;在用va_start(args, &fmt),使得args保留了,后面参数的起始地址。在调用一个功能函数realfunction(args, ...), realfunction的参数个数是固定的。具体是多少,和那些就自己的具体应用。可参看,内核printk函数的实现。

4. 小结
   int virfunction(char *fmt, ...){
      valist args;
      va_start(args, fmt);
      realfunction(args);
      va_end(args);
      return 0;
   }
  
阅读(644) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~