linux-011之stdarg.h头文件

xiaoxiao2021-02-27  190

#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
转载请注明原文地址: https://www.6miu.com/read-15207.html

最新回复(0)