2012-04-27 44 views
5

我一直在寻找关于宏的一些代码,我发现这样的代码,为宏«的va_start»:为什么stdarg.h有一个宏«__va_size»?

#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

没有给我们提供您找到此平台的详细信息,您的问题没有多大意义。 – 2012-04-27 08:06:08

回答

3

默认类型提升规则看起来它被用来计算变量参数列表的开始,基于第一个参数的大小。第一个参数是所需的正常值,即对于printf(),它将是指向格式化字符串的指针。

1

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

1

没有“限制”,执行__va_argsiz轮向上sizeof(t),对于一个类型t,在sizeof(int)倍数。这是必要的,因为在调用堆栈上传递的作为可变参数函数调用协议一部分的未知参数会自动对齐并分配空间的倍数sizeof(int)(显然,在您的平台上),并且必须从那里正确检索。请参阅http://www.cplusplus.com/reference/clibrary/cstdarg/va_start/