我特别关注 utarray 版本 2.0.2 与 1.9.6。(最近的版权分别是 2017 年和 2012 年)。
我需要将 utarray.h 添加到使用 utarray.h 的现有项目中,并且希望这两个标头都来自相同的版本/提交,所以我正在考虑用新的 utarray.h 替换旧的 utarray.h。
我应该注意我并不十分担心编译时的不兼容性,例如名称更改等。我主要担心的是运行时损坏。
如果您查看utarray.h,您会发现它定义的只是宏、一些静态函数和一些 typedef;没有公共符号,所以一切都应该限制在当前的编译单元中。
换句话说,是的,只要您不在同一个文件中包含两个标头(这可能会导致编译时错误)或在您的公共 API 中公开它,您应该是安全的。
也就是说,您标题中问题的答案是“不”;API 中的不兼容更改破坏了向后兼容性。但是根据您在正文中提到的限制,您应该没问题。
一个罕见但 100% 可重现的 utarray 使用堆栈损坏问题导致我尝试升级 JUST utarray.h,但在我的公司全面。
简短的回答是否定的,它不是 100% 向后兼容的。但它非常接近。
更长的答案是针对我们的应用程序,所需的更改非常微不足道,基本用法没有改变,堆栈损坏问题似乎已经消失。它似乎也与其他较旧的标头(例如 uthash)进行了良好的交互。
我发现的唯一接口更改是一个_UNUSED_
用于静默 gcc 警告的宏更改为UTARRAY_UNUSED
. 其他一切似乎都是错误修复。
编辑:我还不够天真,甚至无法确信 1.9.6 存在导致我们的堆栈损坏的问题,但在仔细地在调试器中执行相同的 10 行代码大约 2 之后,我并没有完全排除这种可能性小时,并观察每个变量是否正确。