va_end
- Macro to resetarg_ptr
.
在访问变量参数列表后,arg_ptr
指针通常用va_end()
重置。我知道如果您想重新迭代列表,它是必需的,但如果您不打算这样做,真的需要它吗?这只是一种好的做法,比如“在你的 switch
中总是有一个 default:
”的规则吗?
最佳答案
va_end
用于进行清理。你不想破坏堆栈,是吗?
来自man va_start
:
va_end()
Each invocation of va_start() must be matched by a corresponding invocation of va_end() in the same function. After the call va_end(ap) the variable ap is undefined. Multiple traversals of the list, each bracketed by va_start() and va_end() are possible. va_end() may be a macro or a function.
注意must这个词的存在。
堆栈可能会损坏,因为您不知道 va_start()
在做什么。 va_*
宏被视为黑盒子。每个平台上的每个编译器都可以在那里为所欲为。它可能什么都不做,也可能做很多事情。
一些 ABI 将前几个参数传递到寄存器中,其余的传递到堆栈中。 va_arg()
那里可能更复杂。您可以查看给定实现如何处理可变参数,这可能很有趣,但在编写可移植代码时,您应该将它们视为不透明的操作。
关于c++ - va_end 到底是做什么用的?是否总是需要调用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/587128/