va_start()的第二个参数的意义
va_start(ap,v); 为什么第二个参数必须得是最后一个固定参数(...左边那个)百度查的:
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
我的理解:
是不是将ap指向第一个可变参数(不算已经确认的形参)
那va_arg(ap,类型)的工作原理是啥
这个类型是当前指针指向的类型还是 下一个形参的类型,看很多地方都说第二个参数是下一个形参的类型
如果是下一个参数的类型 那怎么知道第一个可变参数的类型呢
这是 stdarg.h 的源代码
#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 */
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //下一个参数地址
// 将( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )拆成:
/* 指针ap指向下一个参数的地址*/
1.ap += _INTSIZEOF(t); // 当前,ap已经指向下一个参数了
/* ap减去当前参数的大小得到当前参数的地址,再强制类型转换后返回它的值*/
2.return *(t *)( ap - _INTSIZEOF(t))
页:
[1]