是否存在 `va_end` 执行任何重要操作的目标?

问题描述 投票:0回答:2

所有版本的

varargs.h
和/或
stdarg.h
我都见过将
va_end
定义为空宏或一些不透明的编译器特定函数,我猜这些函数也不会执行任何操作。 C 标准中的基本原理指出“某些实现可能需要它”,但没有提供更多细节。

什么时候才真正需要

va_end()
?有任何需要这样的 ABI 示例,最好有解释吗?

c variadic-functions
2个回答
5
投票

Fabrice Bellard 的

tcc
的旧版本使用
va_start()
实现了
malloc()
,并使用
va_end()
实现了
free()
:因此未能调用
va_end()
会泄漏内存。请参阅此处。这是因为它使
va_list
成为指向结构的指针,并且
malloc()
/
free()
(或技术上它们的编译器内置函数)用于分配/释放结构。在较新版本的
tcc
中,
va_list
现在是结构的单元素数组而不是指针,因此
va_end()
现在实际上是无操作,就像通常一样。


-1
投票

C 已经存在了很长很长时间并且有很多标准。这些标准往往会给编译器一些余地,让他们实现自己的填充/标头/等。出于性能和其他原因。我认为添加此内容是因为,如前所述,“某些编译器可能需要它”。尽管语言尝试抽象其实现细节,但有些事情不可避免地会被忽视......希望这对您有帮助=]

© www.soinside.com 2019 - 2024. All rights reserved.