【发布时间】:2012-09-04 11:40:03
【问题描述】:
int max(int n, ...)
我使用cdecl 调用约定,调用者在被调用者返回后清理变量。
我很想知道宏 va_end、va_start 和 va_arg 是如何工作的?
调用者是否将参数数组的地址作为第二个参数传递给 max?
【问题讨论】:
-
这篇博文,amd64 and va_arg 对用于变量参数的
va_arg函数集如何在机器架构和调用约定(与特定处理器一起使用的 ABI)之间存在差异进行了很好的讨论.与旧的 x86 架构相比,具有更多可用寄存器的现代处理器允许在寄存器和堆栈中传递参数。 -
很遗憾,这个问题的所有答案或多或少都是错误的。 (它们对于很久以前定义的 ABI 模糊准确,但是对于过去 20 多年定义的任何 ABI,调用约定要复杂得多,并且涉及将内容放入寄存器和堆栈中。是的,即使对于“CISC ”处理器。)我会写一个更好的答案,但这需要我整个下午,我今天需要做我的实际工作:-P
标签: c gcc variadic-functions calling-convention