据说调用va_start()
后必须跟va_end()
调用,因为va_start()
(总是?)会扰乱堆栈。
任何人都可以解释一下如何调用va_start()
来修改堆栈以及这种修改如何帮助获取可变参数。
答案 0 :(得分:4)
可以修改堆栈。它可能做任何事情,或什么都不做。你不知道。无论它可能做什么或不做什么都被va_end()
取消。这就是你必须打电话的原因。它实际上做了什么,如果有的话,取决于编译器和处理器架构。没有一个答案。
答案 1 :(得分:1)
是的,每次拨打va_start
都必须与va_end
匹配。我认为没有必要了解实施细节。
C11§7.16.1变量参数列表访问宏
本子条款中描述的
va_start
和va_arg
宏应实现为宏,而不是函数。未指定va_copy
和va_end
是使用外部链接声明的宏还是标识符。如果为了抑制宏定义 访问实际函数,或程序定义具有相同名称的外部标识符, 行为未定义。va_start
和va_copy
宏的每次调用都应与同一函数中va_end
宏的相应调用相匹配。
在C ++中也是如此。