Apr 27
// 一般使用方法
// #include <stdarg.h>
// void some_function(type1 var1,type2 last,...)
// {
// va_list ap;
// va_start(ap,last);
// ...
// typex var=va_arg(ap,typex);
// ...
// va_end;
// return;
// }
// stdarg.h
// va_list 其实就是一个字节指针
typedef char *va_list;
// _va_size(type)总是4的倍数,因为系统在处理压栈的时候总是4字节对齐的。
#define __va_size(type) \
(((sizeof(type) + sizeof(long) - 1) / sizeof(long)) * sizeof(long))
// last是最后一个压栈的参数(也是第一个已知类型的参数),ap指向其后一个参数,即可变参数开始的地方。
#define va_start(ap, last) \
((ap) = (va_list)&(last) + __va_size(last))
// 得到类型为type的参数,并使ap指向下一个参数。
#define va_arg(ap, type) \
(*(type *)((ap) += __va_size(type), (ap) - __va_size(type)))
// 为了结构的完整性而定义。
#define va_end(ap) ((void)0)
