【发布时间】:2025-11-22 15:25:01
【问题描述】:
我们在共享库的修订版 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 的第 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,这很好。任何重新编译的代码都将使用无参数构造函数。
我看到的唯一问题是,如果我们需要回滚到没有构造函数的旧版本的共享库,那么针对它编译的任何代码都会中断,但我并不担心这种情况。
【问题讨论】:
标签: c++ gcc g++ compatibility abi