首先是va_list,最简单不过了(<vadefs.h>, L61)
- typedef char * va_list;
va_star
- #define va_start _crt_va_start
- #define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
- #define _ADDRESSOF(v) ( &reinterpret_cast<const char &>(v) )
- #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )//上对齐
va_end
- #define va_end _crt_va_end
- #define _crt_va_end(ap) ( ap = (va_list)0 )
va_arg
- #define va_arg _crt_va_arg
- #define _crt_va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
这段代码写得比较难懂 包含两部分工作
1:*(t*)(ap)对指针进行强制转换,然后取值.(强取值)
2:ap += sizeof(t) ap指向下一个参数
垃圾微软先执行第二部再执行第一步,所以需要减掉一个sizeof(t),
//TODO: 用逗号表达式不好吗? 为什么非要这样写?