【问题标题】:Passing of variable arguments in C在 C 中传递变量参数
【发布时间】:2011-07-27 04:41:02
【问题描述】:

有人知道如何在经典 C 中传递变量参数吗?我今天做了一些调试,大多数常规参数都是通过堆栈传递的。但是,这似乎不适用于可变参数。这些参数是否像常量字符串一样存储在其他地方?

提前致谢!

【问题讨论】:

    标签: c parameter-passing optional-parameters crt


    【解决方案1】:

    这取决于平台。 /usr/include/stdarg.h 是开始寻找细节的地方。

    【讨论】:

    • 在 Unix 上,是的。在其他平台上,stdarg.h 可能在其他地方。 +1,不过。
    • 虽然在技术上是正确的,但您也很难找到许多没有在堆栈上传递它们的平台。
    • @Amigable:我隐约记得 SPARC 使用 varargs 的注册窗口做了一些有趣的事情,但已经有一段时间了,我再也无法访问了。
    • 但是Win32并没有这么特别,是吗:)
    • @Florian:见前面的评论,这表明有些东西是在 x86-64 上的寄存器中传递的。但是,x86 将全部是堆栈:它没有足够的寄存器来考虑使用它们来传递参数。
    【解决方案2】:

    它们经常在堆栈上传递。您正在寻找的是您正在使用的平台的 ABI 规范。

    对于 AMD64 平台,查看例如 here

    【讨论】:

    • 这也是我的预期。但是我遇到了在 Visual Studio 的内存窗口中找不到变量参数的情况... 有关于 C 中参数传递的任何文档吗?
    • @Florian Greinacher,这很奇怪。除了查找适用于 Windows 的 ABI 文档之外,我不知道该说什么。
    • 谢谢,我认为这将有助于找到答案:)
    【解决方案3】:

    【讨论】:

    • 感谢您的回答,但我知道如何使用它们。我的问题是它们是如何传递给被调用者的。
    【解决方案4】:

    这是一个有趣的技巧

    void func(type* values) {
        while(*values) {
            x = *values++;
            /* do whatever with x */
        }
    }
    
    func((type[]){val1,val2,val3,val4,0});
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-28
      • 2023-03-18
      • 2017-05-22
      • 2016-06-02
      • 2012-12-29
      • 2011-12-03
      • 2015-12-20
      • 1970-01-01
      相关资源
      最近更新 更多