2

我认为该函数在完成后会从堆栈中删除参数,但是像 printf 这样的函数在调用时会从堆栈中删除可变数量的参数。

它如何知道要从堆栈中删除多少参数?是否有一个秘密参数来指定传递了多少个参数?

谢谢

4

3 回答 3

4

C 调用约定指定是调用者而不是被调用者负责从堆栈中弹出参数。这就是为什么具有可变参数列表的函数必须是cdecl. 所以,

我认为该函数在完成后会从堆栈中删除参数。

这仅适用于某些调用约定,而不适用于C 调用约定

它如何知道要从堆栈中删除多少参数?是否有一个秘密参数来指定传递了多少个参数?

它没有,不,没有秘密的论点。

于 2012-12-29T21:20:09.657 回答
1

调用者函数将清理堆栈(以正确的调用约定)。编译器将为此生成代码。编译器确切地知道您在参数列表中传递了多少参数,因为它编译了它..

于 2012-12-29T21:26:08.263 回答
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);        

链接到可变参数函数中有多少个参数

于 2012-12-29T21:36:47.077 回答