用法
1  | 
  | 
研究
1  | 
  | 
C语言的函数是从右向左压入堆栈的,调用va_start后,按定义的宏运算,_ADDRESSOF得到v所在的地址,然后这个地址加上v的大小,则使ap指向第一个可变参数如图:
栈底 高地址
| .......     
| 函数返回地址
| .......      
| 函数最后一个参数
| ....                       
| 函数第一个可变参数       <--va_start后ap指向 
| 函数最后一个固定参数
| 函数第一个固定参数 
栈顶 低地址
然后,用va_arg()取得类型t的可变参数值, 先是让ap指向下一个参数:
ap += _INTSIZEOF(t)
然后在减去_INTSIZEOF(t),使得表达式结果为ap之前的值,即当前需要得到的参数的地址,强制转换成指向此参数的类型的指针,然后用*取值最后,用va_end(ap),给ap初始化,保持健壮性。
1  | 
  | 
Linux下的stdarg.h
1  | 
  |