参考自:

http://www.cnblogs.com/hnrainll/archive/2011/07/06/2099494.html

http://www.cnblogs.com/MarvinGeng/archive/2012/07/19/2598923.html

 

1. 函数声明

   首先,要实现类似printf()的变参函数,函数的最后一个参数要用 ... 表示,如 
     int log(char * arg1, ...)
这样编译器才能知道这个函数是变参函数。这个参数与变参函数的内部实现完全没有关系,只是让编译器在编译调用此类函数的语句时不计较参数多少老老实实地把全部参数压栈而不报错,当然...之前至少要有一个普通的参数,这是由实现手段限制的。
2. 函数实现
  C语言通过几个宏实现变参的寻址。下面是linux2.18内核源码里这几个宏的定义,相信符合C89,C99标准的C语言基本都是这样定义的。

 1 typedef char *va_list;
 2 /*
 3 Storage alignment properties -- 堆栈按机器字对齐
 4 */
 5 #define _AUPBND            (sizeof (acpi_native_uint) - 1)
 6 #define _ADNBND            (sizeof (acpi_native_uint) - 1)
 7 /*
 8    Variable argument list macro definitions -- 变参函数内部实现需要用到的宏
 9 */
10 #define _bnd(X, bnd)          (((sizeof (X)) + (bnd)) & (~(bnd)))
11 #define va_arg(ap, T)        (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND))))
12 #define va_end(ap)          (void) 0
13 #define va_start(ap, A)        (void) ((ap) = (((char *) &(A)) + (_bnd (A,_AUPBND))))
View Code

相关文章: