stdarg.h头文件源代码分析

谈到C语言中可变参数函数的实现(参见C语言中可变参数函数实现原理),有一个头文件不得不谈,,那就是stdarg.h

本文从minix源码中的stdarg.h头文件入手进行分析:

1 #ifndef _STDARG_H 2 #define _STDARG_H#ifdef __GNUC__typedef char *va_list; Amount of space required in an argument list for an arg of type TYPE.11 * TYPE may alternatively be an expression whose type is used.__va_rounded_size(TYPE) \15 (((sizeof (TYPE) + sizeof (int) – 1) / sizeof (int)) * sizeof (int))__GNUC__ < 218 19 #ifndef __sparc__20 #define va_start(AP, LASTARG)\21 (AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG)))va_start(AP, LASTARG)\24 (__builtin_saveregs (),\25 AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG)))va_end (va_list);va_end(AP)va_arg(AP, TYPE)\32 (AP += __va_rounded_size (TYPE),\33 *((TYPE *) (AP – __va_rounded_size (TYPE))))/* __GNUC__ >= 2 */36 37 #ifndef __sparc__38 #define va_start(AP, LASTARG)\39 (AP = ((char *) __builtin_next_arg ()))va_start(AP, LASTARG)\42 (__builtin_saveregs (), AP = ((char *) __builtin_next_arg ()))va_end (va_list);va_end(AP)va_arg(AP, TYPE)\49 (AP = ((char *) (AP)) += __va_rounded_size (TYPE),\50 *((TYPE *) ((char *) (AP) – __va_rounded_size (TYPE))))/* __GNUC__ >= 2 *//* not __GNUC__ */typedef char *va_list;__vasz(x)((sizeof(x)+sizeof(int)-1) & ~(sizeof(int) -1))va_start(ap, parmN) ((ap) = (va_list)&parmN + __vasz(parmN))62 #define va_arg(ap, type)\63 (*((type *)((va_list)((ap) = (void *)((va_list)(ap) + __vasz(type))) \64- __vasz(type))))65 #define va_end(ap)/* __GNUC__ *//* _STDARG_H */生命中,每一种苦难的背后都有一片晴朗的天空

stdarg.h头文件源代码分析

相关文章:

你感兴趣的文章:

标签云: