据说调用到va_start()
之后必须调用到,va_end()
因为va_start()
(总是?)会扰乱堆栈。
谁能解释我如何调用va_start()
修改堆栈以及此修改如何帮助获取可变参数。
据说调用到va_start()
之后必须调用到,va_end()
因为va_start()
(总是?)会扰乱堆栈。
谁能解释我如何调用va_start()
修改堆栈以及此修改如何帮助获取可变参数。
它可能会修改堆栈。它可以做任何事情,也可以什么都不做。你不知道。无论它可能做或不做的事情都被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++ 中也是如此。