c++ - va_end 到底是做什么用的?是否总是需要调用它?

标签 c++ c variadic-functions

va_end - Macro to reset arg_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/

相关文章:

C语言 : How to pass a variable arguments list of void* to a function

c++ - 使用可变参数模板和 boost 将表映射到 map

c++ - 已删除 "general"案例的专用模板函数无法使用 g++ <=4.8.0 和 clang++ 编译

c++ - operator[] 的负索引是否定义明确?

c - 如何在不使用 stdio.h 或任何其他库头文件的情况下将字符写入 C 中的标准输出?

c - Linux 中 FreeBSD 的 be64enc 和其他 dec/enc 等效函数?

运行 T 测试时的 Python 运行时错误

c++ - 更有效地遍历原始视频

连续调用递归函数两次

java - 为什么要在 Java Stream 接口(interface)中重载 varargs 方法 of()?