printf函数可变参数的实现

题目:printf函数可变参数是如何实现的?

分析:这道题主要考察函数调用时参数压入堆栈的细节。

printf的声明:int _cdecl printf(const char* format, …),_cdecl是C和C++程序的缺省调用方式,该约定参数从右到左依次入栈。

可变函数的实现代码中format中要给出变量的格式及其格式,并且使用三个宏来帮助访问可变参数。

三个宏的参考代码如下:

typedef char * va_list;

//定义_INTSIZEOF(n)主要是为了某些需要内存的对齐的系统
#define _INTSIZEOF(n) \
((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )

//运行va_start(ap, v)以后,ap指向参数v之后的第一个可变参数在堆栈的地址
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )

//用va_arg()取得类型t的可变参数值,并且ap指针完成自加,指向下一个参数的位置
#define va_arg(ap,t) \
( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )

#define va_end(ap) ( ap = (va_list)0 )








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值