5

我一直在寻找一些关于宏的代码,我找到了这样的代码,用于宏 «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

4 回答 4

4

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

于 2012-04-27T08:01:03.193 回答
3

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

于 2012-04-27T08:02:02.833 回答
1

没有“限制”,执行。以.的__va_argsiz 倍数对. 这是必需的,因为作为 varargs 函数调用协议的一部分在调用堆栈上传递的 uknown 参数会自动对齐并分配空间的倍数(显然,在您的平台上),并且必须从那里正确检索。sizeof(t)tsizeof(int)sizeof(int)

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

于 2012-04-27T09:23:42.237 回答
1

这用于可变长度参数。例如printf使用这样一个可变长度的参数列表。__va_argsiz计算列表的大小并va_start确定开始。

于 2012-04-27T08:03:36.923 回答