我必须维护我正在开发的这个 C++ 库的二进制兼容性。
目前,我有一些类似的东西
class Foo
{
void Bar()
{
static bool flag = true;
}
}
删除会flag
破坏二进制兼容性Foo
吗?
除了我的编译器目前是 VC7.1,如果这很重要的话。
我必须维护我正在开发的这个 C++ 库的二进制兼容性。
目前,我有一些类似的东西
class Foo
{
void Bar()
{
static bool flag = true;
}
}
删除会flag
破坏二进制兼容性Foo
吗?
除了我的编译器目前是 VC7.1,如果这很重要的话。
该static
变量不是函数接口的一部分,因此不会影响二进制兼容性。尽管如此,您应该知道,如果函数真的那么简单,那么它可能已经被内联,在这种情况下,除非您重新编译所有用户,否则您将破坏 ODR。
简单的建议:尽可能重新编译。如果不可能,请确保它没有内联在原始代码中。
它不会破坏二进制兼容性,因为某些东西肯定会崩溃,或者该程序将无法启动。
但是,如果该方法被内联,它很可能会破坏功能。内联版本仍将访问该静态变量,然后针对新头文件构建的代码将生成不使用静态变量的方法。这是否是一个问题取决于代码,但通常情况下,静态变量(不会被重新编译的代码使用)可能不仅仅是为了好玩,替换也不是(不会被使用通过旧的内联代码)。
教训:如果您想避免在库头修改后重新编译所有内容,请不要从头文件中的任何代码访问静态变量,或执行您可能想要更改的任何其他操作。假设头文件中的所有代码都可能被内联。
相关问题:内联函数中的静态变量
不,它没有外部可见性。