【发布时间】:2013-09-19 09:44:23
【问题描述】:
据说在调用va_start() 之后必须调用va_end(),因为va_start()(总是?)会干扰堆栈。
谁能解释一下对va_start() 的调用如何修改堆栈以及这种修改如何帮助获取可变参数。
【问题讨论】:
标签: c++ c variadic-functions
据说在调用va_start() 之后必须调用va_end(),因为va_start()(总是?)会干扰堆栈。
谁能解释一下对va_start() 的调用如何修改堆栈以及这种修改如何帮助获取可变参数。
【问题讨论】:
标签: c++ c variadic-functions
它可能修改堆栈。它可以做任何事情,也可以什么都不做。你不知道。 va_end() 可以撤销它可能做或不做的任何事情。这就是为什么你必须调用它。它实际上做了什么,如果有的话,取决于编译器和处理器架构。没有一个答案。
【讨论】:
是的,对va_start 的每次调用都必须与va_end 匹配。我认为没有必要知道实现细节。
C11 §7.16.1 变量参数列表访问宏
本小节中描述的
va_start和va_arg宏应作为宏而不是函数来实现。未指定va_copy和va_end是使用外部链接声明的宏还是标识符。如果宏定义被抑制以 访问一个实际的函数,或者一个程序定义了一个同名的外部标识符, 行为未定义。va_start和va_copy宏的每次调用都应与同一函数中va_end宏的相应调用相匹配。
在 C++ 中也是如此。
【讨论】: