C可变长参数函数的几个宏的理解

// stdarg.h
#define va_start _crt_va_start
#define va_arg _crt_va_arg
#define va_end _crt_va_end
// vadefs.h
typedef 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头文件源代码分析:

原文地址:https://www.cnblogs.com/cnsec/p/3789814.html