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语言在函数