1。C函数参数压栈顺序为从右到左,即第一个参数最靠近栈顶。
2。可变参数va-list必须有至少一个参数,最左边的参数,即栈顶参数,这样可以根据第一个参数地址,从低地址起,到高地址,逐一找到其他参数。
Linux 相关va_list宏定义
/*
* Storage alignment properties
*/
#define _AUPBND (sizeof (acpi_native_int) - 1)
#define _ADNBND (sizeof (acpi_native_int) - 1)
/*
* Variable argument list macro definitions
*/
#define _bnd(X, bnd) (((sizeof (X)) + (bnd)) & (~(bnd)))
//先得到ap的值,加了size bounder,然后减了size得到该T的值。
#define va_arg(ap, T) (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND))))
#define va_end(ap) (void) 0
#define va_start(ap, A) (void) ((ap) = (((char *) &(A)) + (_bnd (A,_AUPBND))))