所有版本的
varargs.h
和/或 stdarg.h
我都见过将 va_end
定义为空宏或一些不透明的编译器特定函数,我猜这些函数也不会执行任何操作。 C 标准中的基本原理指出“某些实现可能需要它”,但没有提供更多细节。
什么时候才真正需要
va_end()
?有任何需要这样的 ABI 示例,最好有解释吗?
Fabrice Bellard 的
tcc
的旧版本使用 va_start()
实现了 malloc()
,并使用 va_end()
实现了 free()
:因此未能调用 va_end()
会泄漏内存。请参阅此处。这是因为它使 va_list
成为指向结构的指针,并且 malloc()
/free()
(或技术上它们的编译器内置函数)用于分配/释放结构。在较新版本的 tcc
中,va_list
现在是结构的单元素数组而不是指针,因此 va_end()
现在实际上是无操作,就像通常一样。
C 已经存在了很长很长时间并且有很多标准。这些标准往往会给编译器一些余地,让他们实现自己的填充/标头/等。出于性能和其他原因。我认为添加此内容是因为,如前所述,“某些编译器可能需要它”。尽管语言尝试抽象其实现细节,但有些事情不可避免地会被忽视......希望这对您有帮助=]