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;
}
阅读(687) | 评论(0) | 转发(0) |