5

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

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

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

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

除了我的编译器目前是 VC7.1,如果这很重要的话。

4

3 回答 3

2

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

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

于 2013-03-19T12:29:02.653 回答
1

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

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

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

相关问题:内联函数中的静态变量

于 2013-03-19T12:47:09.467 回答
0

不,它没有外部可见性。

于 2013-03-19T12:28:02.137 回答