0

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

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

4

2 回答 2

4

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

于 2013-09-19T01:25:41.270 回答
1

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

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

本小节中描述的va_startva_arg宏应作为宏而不是函数来实现。未指定va_copy和是否va_end是使用外部链接声明的宏或标识符。如果为了访问实际函数而禁止宏定义,或者程序定义了具有相同名称的外部标识符,则行为未定义。和宏的每次调用都应与同一函数中相应的宏调用相匹配。va_startva_copyva_end

在 C++ 中也是如此。

于 2013-09-19T01:15:55.537 回答