我认为该函数在完成后会从堆栈中删除参数,但像printf这样的函数会在调用时从堆栈中删除可变数量的参数。
如何知道要从堆栈中删除多少参数?是否有一个秘密参数来指定传递多少个参数?
由于
答案 0 :(得分:4)
C调用约定指定调用者而不是被调用者负责从堆栈中弹出参数。这就是具有可变参数列表的函数必须为cdecl
的原因。所以,
我认为该函数在完成后会从堆栈中删除参数。
仅适用于某些调用约定,但对于 C调用约定则不然。
如何知道要从堆栈中删除多少参数?是否有一个秘密参数来指定传递多少个参数?
它没有,也没有秘密争论。
答案 1 :(得分:1)
调用函数将清理堆栈(使用正确的调用约定)。编译器将为其生成代码。编译器是确切知道你在参数列表中传递了多少个参数的编译器,因为它编译了它..
答案 2 :(得分:0)
调用代码清理堆栈,并且由被调用函数决定是否已经为其想要做的事情传递了“足够”的参数。这不一定是一个论据,它可能是这样的:
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);