Bootstrap

C语言不确定参数

C语言中有一种长度不确定的参数,形如:"...",它主要用在参数个数不确定的函数中,我们最容易想到的例子是printf函数。
C语言用va_start等宏来处理这些可变参数。其实原理挺简单,就是根据参数入栈的特点从最靠近第一个可变参数的固定参数开始,依次获取每个可变参数的地址。
标准C语言中头文件<stdarg.h>专门用来对付可变参数列表,它包含了一组宏和一个va_list的typedef声明。不同平台有不同的定义,X86下的宏定义:

typedef char *  va_list;
#define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define va_start(ap,v)  ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap)      ( ap = (va_list)0 )

_INTSIZEOF(n)宏是为了考虑那些内存地址需要对齐的系统(从此可以看出编译器生成参数调用时,必须是满足一定的对齐规则的).

为了能从固定参数依次得到每个可变参数,va_start,va_arg充分利用下面两点:
1.C语言在函数
;