【问题标题】:Will removing `static` from a private function break ABI compatibility?从私有函数中删除“静态”会破坏 ABI 兼容性吗?
【发布时间】:2016-10-27 15:44:58
【问题描述】:

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

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

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

【问题讨论】:

  • 更改 ABI更改 ABI 以破坏现有程序 是两件不同的事情。你肯定在做第一个,但也许不是第二个。
  • 不。我想唯一的风险是名称冲突,以防有另一个函数具有相同的名称,但具有不同的接口。
  • @tofro 如果您添加一个解释您的评论的答案,我会很乐意选择它。

标签: c backwards-compatibility abi


【解决方案1】:

我认为有几点需要考虑:

  • 它会改变 ABI 吗?

    是的,因为现在有一个新的公共符号。就 ABI 而言,添加新函数和从现有函数中删除 static 没有区别。

  • 它会破坏兼容性吗?

    它肯定是在另一个方向上:链接到使用新符号的新版本库的程序将无法与旧版本的库一起运行。

  • 好的,但是想要升级旧库的用户呢?

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

    但是如果符号是“命名空间的”(例如,如果库中的所有名称都使用 foo_ 前缀并且新符号也使用),那么我会认为这种更改在道德上不会破坏和新的 ABI与旧版本兼容。

【讨论】:

    猜你喜欢
    • 2013-03-08
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    相关资源
    最近更新 更多