【问题标题】:va_start() modifies stackva_start() 修改堆栈
【发布时间】:2013-09-19 09:44:23
【问题描述】:

据说在调用va_start() 之后必须调用va_end(),因为va_start()(总是?)会干扰堆栈。

谁能解释一下对va_start() 的调用如何修改堆栈以及这种修改如何帮助获取可变参数。

【问题讨论】:

标签: c++ c variadic-functions


【解决方案1】:

可能修改堆栈。它可以做任何事情,也可以什么都不做。你不知道。 va_end() 可以撤销它可能做或不做的任何事情。这就是为什么你必须调用它。它实际上做了什么,如果有的话,取决于编译器和处理器架构。没有一个答案。

【讨论】:

  • 当然,它在任何特定编译器中的实际作用在宏定义中是可见的。
【解决方案2】:

是的,对va_start 的每次调用都必须与va_end 匹配。我认为没有必要知道实现细节。

C11 §7.16.1 变量参数列表访问宏

本小节中描述的va_startva_arg 宏应作为宏而不是函数来实现。未指定 va_copyva_end 是使用外部链接声明的宏还是标识符。如果宏定义被抑制以 访问一个实际的函数,或者一个程序定义了一个同名的外部标识符, 行为未定义。 va_startva_copy 宏的每次调用都应与同一函数中va_end 宏的相应调用相匹配。

在 C++ 中也是如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 2014-12-09
    • 2012-04-21
    • 2016-04-05
    • 1970-01-01
    • 2017-03-05
    相关资源
    最近更新 更多