va_start()修改堆栈

时间:2013-09-19 01:07:03

标签: c++ c variadic-functions

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

任何人都可以解释一下如何调用va_start()来修改堆栈以及这种修改如何帮助获取可变参数。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

是的,每次拨打va_start都必须与va_end匹配。我认为没有必要了解实施细节。

  

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

     

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

在C ++中也是如此。