我们在共享库的修订版 1 中有一个结构,我们需要为它维护 ABI:
struct Person
{
std::string first_name;
std::string last_name;
}
在修订版 2 中,我们将 Person 更改为:
class Person
{
public:
Person(const std::string &f, const std::string &l);
std::string first_name;
std::string last_name;
}
为了保持源代码兼容性,我们想修改 Person 的 reversion 1,以便针对较新的头文件编译的代码将运行,而未重新编译的代码将运行。
我们是否可以使用两个新的非内联构造函数来执行以下操作:
class Person
{
public:
Person();
Person(const std::string &f, const std::string &l);
std::string first_name;
std::string last_name;
}
我们正在使用 g++ 完成这一切。在使用 nm 查看生成的共享库时,我没有看到普通结构的构造函数或析构函数,所以我猜测未重新编译的代码只会像以前一样在调用站点构造 Person,这很好。任何重新编译的代码都将使用无参数构造函数。
我看到的唯一问题是,如果我们需要回滚到没有构造函数的旧版本的共享库,那么针对它编译的任何代码都会中断,但我并不担心这种情况。