您的位置:首页 > 其它

printf函数可变参数的实现

2013-08-30 00:00 218 查看
题目: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 )




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: