万千只cnm 发表于 2021-5-27 22:25:40

va_start()的第二个参数的意义

va_start(ap,v); 为什么第二个参数必须得是最后一个固定参数(...左边那个)
百度查的:
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
我的理解:
是不是将ap指向第一个可变参数(不算已经确认的形参)

那va_arg(ap,类型)的工作原理是啥   

这个类型是当前指针指向的类型还是   下一个形参的类型,看很多地方都说第二个参数是下一个形参的类型   
如果是下一个参数的类型   那怎么知道第一个可变参数的类型呢


人造人 发表于 2021-5-28 10:44:58

这是 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 */

万千只cnm 发表于 2021-5-28 11:23:22

#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]
查看完整版本: va_start()的第二个参数的意义