va_系列宏的实现(x86)

首先是va_list,最简单不过了(<vadefs.h>, L61)

Code:
  1. typedef char *  va_list;  

 va_star

Code:
  1.   
  2. #define va_start _crt_va_start   
  3.   
  4. #define _crt_va_start(ap,v)  ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )   
  5.   
  6. #define _ADDRESSOF(v)   ( &reinterpret_cast<const char &>(v) )   
  7. #define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )//上对齐  

va_end

Code:
  1. #define va_end _crt_va_end   
  2. #define _crt_va_end(ap)      ( ap = (va_list)0 )  

va_arg

Code:
  1. #define va_arg _crt_va_arg   
  2. #define _crt_va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )  

这段代码写得比较难懂 包含两部分工作

1:*(t*)(ap)对指针进行强制转换,然后取值.(强取值)

2:ap += sizeof(t)    ap指向下一个参数

垃圾微软先执行第二部再执行第一步,所以需要减掉一个sizeof(t),

//TODO: 用逗号表达式不好吗? 为什么非要这样写?

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值