【问题标题】:Will adding/removing a function static variable break binary compatibility?添加/删除函数静态变量会破坏二进制兼容性吗?
【发布时间】:2013-03-08 02:58:57
【问题描述】:

我必须维护我正在开发的这个 C++ 库的二进制兼容性。

目前,我有一些类似的东西

class Foo
{
    void Bar()
    {
        static bool flag = true;
    }
}

删除flag 会破坏Foo 的二进制兼容性吗?

除此之外如果重要的话,我的编译器目前是 VC7.1。

【问题讨论】:

  • @downvoter - 你愿意解释一下吗?

标签: c++


【解决方案1】:

static 变量不是函数接口的一部分,因此不会影响二进制兼容性。尽管如此,您应该知道,如果函数真的那么简单,那么它可能已经被内联,在这种情况下,除非您重新编译所有用户,否则您将破坏 ODR。

简单的建议:尽可能重新编译。如果不可能,请确保它没有内联在原始代码中。

【讨论】:

    【解决方案2】:

    它不会破坏二进制兼容性,因为它肯定会崩溃,或者该程序将无法启动。

    但是,如果该方法被内联,它很可能会破坏功能。内联版本仍将访问该静态变量,然后针对新头文件构建的代码将生成不使用静态变量的方法。这是否是一个问题取决于代码,但通常情况下,静态变量(不会被重新编译的代码使用)可能不仅仅是为了好玩,替换也不是(不会被使用通过旧的内联代码)。

    课程:如果您想避免在修改库头文件后重新编译所有内容,请不要从头文件中的任何代码访问静态变量,或执行您可能想要更改的任何其他操作。假设头文件中的所有代码都可能被内联。

    相关问题:static variables in an inlined function

    【讨论】:

      【解决方案3】:

      没有。它没有外部可见性。

      【讨论】:

        猜你喜欢
        • 2016-08-20
        • 2018-12-27
        • 2015-07-06
        • 2012-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-15
        • 1970-01-01
        相关资源
        最近更新 更多