假设您正在处理需要保持ABI兼容性的库的源代码。这个库有一个.c文件,它定义了static
函数,如下所示:
static int
wl_message_count_arrays(const struct wl_message *message)
{
// ...
}
此函数未在任何导出的标头中公开,但我想在私有标头中公开它。为此,无法将该功能标记为static
。删除函数签名的static
修饰符会更改ABI吗?
答案 0 :(得分:2)
我认为有几点需要考虑:
是否会改变ABI?
是的,因为现在有一个新的公共符号。就ABI而言,添加新功能与从现有功能中删除static
之间没有区别。
是否会破坏兼容性?
它肯定会朝另一个方向发展:与使用新符号的新版本库相关联的程序不会使用旧版本的库运行。
好的,但是那个想升级的旧图书馆的用户呢?
在这种情况下,他们可能会自己定义一个具有相同名称的符号,从而导致与新库发生冲突。从技术上讲,这是一个突破性的变化。
但如果符号是"命名空间" (例如,如果库中的所有名称都使用foo_
前缀而新符号也是如此),那么我认为这种变化在道德上是不会破坏的,新的ABI与旧的兼容。< / p>