用法
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 |
|