繁体   English   中英

如何在变量参数函数中在堆栈上传递参数?

[英]How are parameters passed on the stack in variable argument function?

我以为函数完成后会从堆栈中删除参数,但是像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);        

链接到varargs函数中的多少个参数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM