// stdarg.h#define va_start _crt_va_start#define va_arg _crt_va_arg#define va_end _crt_va_end// vadefs.htypedef char * va_list;#define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
//_crt_va_start函数中的 ap 为v后面的参数的地址
#define _crt_va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )//_crt_va_arg函数中的 ap 为下一个参数的地址,但整个宏返回当前类型为t的参数的值#define _crt_va_end(ap) ( ap = (va_list)0 )//_crt_va_end(ap) 当ap不用时,指针ap指向NULL(空指针),防止其成为野指针#define _ADDRESSOF(v) ( &(v) )#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
stdarg.h头文件源代码分析: