从私有函数中删除`static`会破坏ABI的兼容性吗?

假设您正在处理需要保持ABI兼容性的库的源代码.这个库有一个.c文件,它定义了一个静态函数,如下所示:

static int
wl_message_count_arrays(const struct wl_message *message)
{
    // ...
}

此函数不会在任何导出的标头中公开,但我想在私有标头中公开它.为此,该功能不能标记为静态.删除函数签名的静态修饰符会改变ABI吗?

最佳答案 我认为有几点需要考虑:

>它会改变ABI吗?

是的,因为现在有一个新的公共符号.就ABI而言,添加新函数和从现有函数中删除静态没有区别.
>它是否会破坏兼容性?

它肯定会朝另一个方向发展:与使用新符号的新版本库相关联的程序将无法与旧版本的库一起运行.
>好的,但是想要升级的旧图书馆的用户呢?

在这种情况下,他们有可能自己定义一个具有相同名称的符号,从而导致与新库冲突.从技术上讲,这是一个突破性的变化

但是如果符号是“命名空间”(例如,如果库中的所有名称都使用foo_前缀而新符号也是如此),那么我认为这种改变在道德上是不会破坏的,新的ABI与旧的相符.

点赞