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

时间:2016-10-27 15:44:59

标签: c backwards-compatibility abi

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

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

此函数未在任何导出的标头中公开,但我想在私有标头中公开它。为此,无法将该功能标记为static。删除函数签名的static修饰符会更改ABI吗?

1 个答案:

答案 0 :(得分:2)

我认为有几点需要考虑:

  • 是否会改变ABI?

    是的,因为现在有一个新的公共符号。就ABI而言,添加新功能与从现有功能中删除static之间没有区别。

  • 是否会破坏兼容性?

    它肯定会朝另一个方向发展:与使用新符号的新版本库相关联的程序不会使用旧版本的库运行。

  • 好的,但是那个想升级的旧图书馆的用户呢?

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

    但如果符号是&#34;命名空间&#34; (例如,如果库中的所有名称都使用foo_前缀而新符号也是如此),那么我认为这种变化在道德上是不会破坏的,新的ABI与旧的兼容。< / p>