我正在寻找一些关于宏的代码,我找到了这样的代码,对于宏«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»功能的目标究竟是什么。这是对齐限制吗?
谢谢!
答案 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/。