Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1885546
  • 博文数量: 333
  • 博客积分: 10791
  • 博客等级: 上将
  • 技术积分: 4314
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-08 07:39
文章分类

全部博文(333)

文章存档

2015年(1)

2011年(116)

2010年(187)

2009年(25)

2008年(3)

2007年(1)

分类:

2009-03-05 23:45:53

stdarg.h是标准参数头文件。它以宏的形式定义变量参数列表。一个类型(va_list)和三个宏(va_start,va_arg,va_end),用于cprintf函数。

 

lab1头文件:inc/stdarg.h, 其全部内容如下(及注释):

#ifndef JOS_INC_STDARG_H
#define JOS_INC_STDARG_H

 

typedef char *va_list;

 

//此文件用于函数调用时候对堆栈的处理。
//宏 __va_size: 计算变量type的size。 由于在32-bit的机器上,

//堆栈的增减始终是以32bit为单位,所以必须将type处理成32-bit对齐

#define __va_size(type) \
 (((sizeof(type) + sizeof(long) - 1) / sizeof(long)) * sizeof(long))

 

//下面这个函数(用宏实现)是ap指向传给函数的可变参数表的第一个参数。

//在第一次调用va_arg或va_end之前,必须先调用该函数。

//宏 va_start(ap, last): 用于移动char*指针, 指向栈里last所在位置的下一个位置#define va_start(ap, last) \
 ((ap) = (va_list)&(last) + __va_size(last))

 

//宏 va_arg(ap, type): 返回栈里ap所指向的位置的值,并且将ap指向栈的下一个位置

#define va_arg(ap, type) \
 (*(type *)((ap) += __va_size(type), (ap) - __va_size(type)))

#define va_end(ap) ((void)0)

#endif /* !JOS_INC_STDARG_H */

 

====================================================

====================================================

阅读(2082) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~