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头文件源代码分析:
网络上志同道合,我们一起学习网络安全,一起进步,QQ群:694839022