当前位置: 技术问答>linux和unix
请教内核代码,有关stdarg.h,有源码参考!
来源: 互联网 发布时间:2016-06-15
本文导语: #ifndef _STDARG_H #define _STDARG_H typedef char *va_list; /* Amount of space required in an argument list for an arg of type TYPE. TYPE may alternatively be an expression whose type is used. */ #define __va_rounded_size(TYPE) (((sizeof...
#ifndef _STDARG_H
#define _STDARG_H
typedef char *va_list;
/* Amount of space required in an argument list for an arg of type TYPE.
TYPE may alternatively be an expression whose type is used. */
#define __va_rounded_size(TYPE)
(((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
#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
void va_end (va_list); /* Defined in gnulib */
#define va_end(AP)
#define va_arg(AP, TYPE)
(AP += __va_rounded_size (TYPE),
*((TYPE *) (AP - __va_rounded_size (TYPE))))
#endif /* _STDARG_H */
这是stdarg.h的所有代码,本人有一处不明:
#define va_arg(AP, TYPE)
(AP += __va_rounded_size (TYPE),
*((TYPE *) (AP - __va_rounded_size (TYPE))))
这里的AP为什么先加__va_rounded_size (TYPE),之后又减去__va_rounded_size (TYPE)呢,这样有什么用呢?
这样能完成每次执行va_arg后,使AP指向下一个参数的功能吗?
#define _STDARG_H
typedef char *va_list;
/* Amount of space required in an argument list for an arg of type TYPE.
TYPE may alternatively be an expression whose type is used. */
#define __va_rounded_size(TYPE)
(((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
#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
void va_end (va_list); /* Defined in gnulib */
#define va_end(AP)
#define va_arg(AP, TYPE)
(AP += __va_rounded_size (TYPE),
*((TYPE *) (AP - __va_rounded_size (TYPE))))
#endif /* _STDARG_H */
这是stdarg.h的所有代码,本人有一处不明:
#define va_arg(AP, TYPE)
(AP += __va_rounded_size (TYPE),
*((TYPE *) (AP - __va_rounded_size (TYPE))))
这里的AP为什么先加__va_rounded_size (TYPE),之后又减去__va_rounded_size (TYPE)呢,这样有什么用呢?
这样能完成每次执行va_arg后,使AP指向下一个参数的功能吗?
|
AP和TYPE是分开的啊,
AP += __va_rounded_size(TYPE).这只是对AP的操作,
后面的半部分是对TYPE的操作。
智商有限,看得不是很明白...
AP += __va_rounded_size(TYPE).这只是对AP的操作,
后面的半部分是对TYPE的操作。
智商有限,看得不是很明白...