va_start() 修改堆栈

va_start() modifies stack

本文关键字:修改 堆栈 start va      更新时间:2023-10-16

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

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

可能会修改堆栈。它可以做任何事情,也可以什么都不做。你不知道。无论它可能做什么或不做什么,都会被va_end()撤消。这就是为什么你必须称呼它。它的实际功能(如果有的话)取决于编译器和处理器体系结构。没有一个单一的答案。

是的

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

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

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

C++也是如此。