我认为该函数在完成后会从堆栈中删除参数,但是像 printf 这样的函数在调用时会从堆栈中删除可变数量的参数。
它如何知道要从堆栈中删除多少参数?是否有一个秘密参数来指定传递了多少个参数?
谢谢
C 调用约定指定是调用者而不是被调用者负责从堆栈中弹出参数。这就是为什么具有可变参数列表的函数必须是cdecl
. 所以,
我认为该函数在完成后会从堆栈中删除参数。
这仅适用于某些调用约定,而不适用于C 调用约定。
它如何知道要从堆栈中删除多少参数?是否有一个秘密参数来指定传递了多少个参数?
它没有,不,没有秘密的论点。
调用者函数将清理堆栈(以正确的调用约定)。编译器将为此生成代码。编译器确切地知道您在参数列表中传递了多少参数,因为它编译了它..
调用代码清理堆栈,并由被调用函数正确确定是否为它想要做的任何事情传递了“足够”的参数。这不一定是这样的论点,它可能是这样的:
int sum(int first, ...)
{
int s = first;
int v;
va_list va;
va_start(va, first);
while (v = va_arg(va, int) != -1)
{
sum += v;
}
va_end(va);
return sum;
}
x = sum(1, 2, 3, -1);
y = sum(1, 2, 3, 4, 5, 6, 7, 8, 9, -1);