从私有函数中删除 static 会破坏 ABI 兼容性吗?
Will removing `static` from a private function break ABI compatibility?
假设您正在处理需要保持 ABI 兼容性的库的源代码。这个库有一个 .c 文件,它定义了一个 static
函数,如下所示:
static int
wl_message_count_arrays(const struct wl_message *message)
{
// ...
}
此函数未在任何导出的 header 中公开,但我想在私有 header 中公开它。这样做,函数不能被标记为static
。删除函数签名的 static
修饰符会改变 ABI 吗?
我觉得有几点需要考虑:
它会改变 ABI 吗?
是的,因为现在有一个新的 public 符号。就 ABI 而言,添加新函数和从现有函数中删除 static
没有区别。
它会破坏兼容性吗?
它肯定是相反的:链接到使用新符号的新版本库的程序将不会 运行 与旧版本的库链接。
好的,但是旧库用户想要升级怎么办?
在这种情况下,他们可能会自己定义同名符号,从而导致与新库发生冲突。从技术上讲,这是一个重大变化。
但如果符号是 "namespaced"(例如,如果库中的所有名称都使用 foo_
前缀,而新符号也使用),那么我会在道德上考虑这种变化 non-breaking 并且新的 ABI 与旧的 ABI 兼容。
假设您正在处理需要保持 ABI 兼容性的库的源代码。这个库有一个 .c 文件,它定义了一个 static
函数,如下所示:
static int
wl_message_count_arrays(const struct wl_message *message)
{
// ...
}
此函数未在任何导出的 header 中公开,但我想在私有 header 中公开它。这样做,函数不能被标记为static
。删除函数签名的 static
修饰符会改变 ABI 吗?
我觉得有几点需要考虑:
它会改变 ABI 吗?
是的,因为现在有一个新的 public 符号。就 ABI 而言,添加新函数和从现有函数中删除
static
没有区别。它会破坏兼容性吗?
它肯定是相反的:链接到使用新符号的新版本库的程序将不会 运行 与旧版本的库链接。
好的,但是旧库用户想要升级怎么办?
在这种情况下,他们可能会自己定义同名符号,从而导致与新库发生冲突。从技术上讲,这是一个重大变化。
但如果符号是 "namespaced"(例如,如果库中的所有名称都使用
foo_
前缀,而新符号也使用),那么我会在道德上考虑这种变化 non-breaking 并且新的 ABI 与旧的 ABI 兼容。