分类:
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 */
====================================================
====================================================