#ifndef _STDARG_H
#define _STDARG_H
typedef char * va_list; //定义va_list是一个字符类型指针
/*
*取整后的TYPE类型的字节长度值,是int长度(4)的倍数
*/
#define _va_rounded_size(TYPE) \
(((sizeof(TYPE)+sizeof(int)-1)/sizeof(int))*sizeof(int))
/*
*下面这个函数使AP指向传给函数的可变参数的第一个参数
*在第一次调用va_arg或va_end之前,先调用该函数
*_builtin_saceregs是gcc库程序libgcc2定义的,用于
*保存寄存器
*/
#ifndef __sparc__
#define va_start(AP,LASTARG)\
(AP=((char*)&(LASTARG)+_va_rounded_size(LASTARG)))
#else
#define va_start(AP,LASTARG)\
(_builtin_saveregs(), \
AP=((char*)&(LASTARG)+_va_rounded_size(LASTARG)) )
#endif
/*
*该函数用于完成一次正常返回,va_end可以修改AP
*使其在重新调用va_start之前不能被使用.
*va_end必须在va_arg读完所有参数后在调用
*/
void va_end(va_list);
#define va_end(AP)
/*
*第一次使用va_arg时,返回表中的第一个参数,后续的每次调用都将
*返回表中的下一个参数.这是通过先访问AP,然后把他增加以指向下
*一项来实现的
*/
#define va_arg(AP,TYPE) \
(AP += _va_rounded_size(TYPE),(*(TYPE*)(AP-_va_rounded_size(\ TYPE))))
#endif