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

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”函数的确切目标是什么,是否存在对齐限制?
谢谢!

1
如果你不告诉我们你在哪个平台找到这个信息,那么你的问题就没有多大意义。 - Jens Gustedt
4个回答

4

C 语言中涉及到的两个概念是对齐和默认类型提升规则。


3

看起来它用于根据第一个参数的大小计算可变参数列表的起始位置。第一个参数是必需的普通参数,例如对于printf()函数,它将是指向格式化字符串的指针。


1

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


1
没有“限制”,只有“实现”。__va_argsizt类型的sizeof(t)sizeof(int)的倍数舍入。这是必要的,因为作为varargs函数调用协议的一部分传递到调用堆栈上的未知参数会自动对齐并以sizeof(int)的倍数分配空间(显然,在您的平台上),必须从中正确检索。
另请参见http://www.cplusplus.com/reference/clibrary/cstdarg/va_start/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接