【发布时间】:2011-12-07 10:31:48
【问题描述】:
在我的图书馆里有这样一个类:
class Foo {
public:
void doSomething();
};
现在,doSomething() 的实现已经增长了很多,我想将其拆分为两种方法:
class Foo {
public:
void doSomething();
private:
void doSomething1();
void doSomething2();
};
doSomething() 的实现是这样的:
void Foo::doSomething() {
this->doSomething1();
this->doSomething2();
}
但是现在类接口已经改变了。如果我编译这个库,所有使用这个库的现有应用程序都将无法工作,外部链接会改变。
如何避免破坏二进制兼容性?
我猜内联解决了这个问题。这样对吗?它是便携式的吗?如果编译器优化取消内联这些方法会发生什么?
class Foo {
public:
void doSomething();
private:
inline void doSomething1();
inline void doSomething2();
};
void Foo::doSomething1() {
/* some code here */
}
void Foo::doSomething2() {
/* some code here */
}
void Foo::doSomething() {
this->doSomething1();
this->doSomething2();
}
编辑: 我在方法拆分前后测试了这段代码,它似乎保持了二进制兼容性。但我不确定这是否适用于每个操作系统和每个编译器以及更复杂的类(使用虚拟方法、继承......)。有时我在添加像这样的私有方法后会破坏二进制兼容性,但现在我不记得是在哪种特定情况下。也许这是由于按索引查看的符号表(如 Steve Jessop 在他的回答中的注释)。
【问题讨论】:
-
为什么类的私有部分的变化会影响外部链接?
-
您可以从一开始就使用 Pimpl 来防止这个问题 - 它封装了这些更改。
-
@littleadv:您可以对破坏二进制兼容性的类的私有部分进行很多更改。添加私有虚函数,添加私有数据成员。这恰好不是其中之一,至少在我知道的实现中,但函数是私有的事实与它无关。
标签: c++ interface methods inline