为什么stdarg.h有一个宏«__va_size»?

时间:2012-04-27 07:58:05

标签: c++ c variadic-functions

我正在寻找一些关于宏的代码,我找到了这样的代码,对于宏«va_start»:

#define __va_argsiz(t)  \
    (((sizeof(t) + sizeof(int) - 1) / sizeof(int)) * sizeof(int))
#define va_start(ap, pN)    \
    ((ap) = ((va_list) (&pN) + __va_argsiz(pN)))

我想知道«__va_argsiz»功能的目标究竟是什么。这是对齐限制吗?

谢谢!

4 个答案:

答案 0 :(得分:4)

对齐和C中的默认类型提升规则。

答案 1 :(得分:3)

看起来它用于根据第一个参数的大小计算变量参数列表的开头。第一个参数是必需的正常参数,即对于printf(),它将是指向格式化字符串的指针。

答案 2 :(得分:1)

这用于variable length arguments。例如,printf使用这样的可变长度参数列表。 __va_argsiz计算列表的大小,va_start确定开头。

答案 3 :(得分:1)

没有“限制”,实施。对于__va_argsiz类型,sizeof(t) 汇总 t,其倍数为sizeof(int)。这是必要的,因为作为varargs函数调用协议的一部分在调用堆栈上传递的uknown参数会自动对齐,并以sizeof(int)的倍数(显然,在您的平台上)分配空间,并且必须检索从那里开始。

另见http://www.cplusplus.com/reference/clibrary/cstdarg/va_start/