【发布时间】:2011-06-08 16:26:21
【问题描述】:
考虑以下 C++ 代码:
struct X
{
int a;
int b;
};
X foobar()
{
X x = { 1, 2 };
return x;
}
现在假设这段代码被放在一个共享库中,供第三方应用程序使用。
我的问题是:如果我在X 的末尾添加另一个成员(例如int c),并在foobar() 中初始化它,调用foobar() 的现有应用程序会中断吗?请注意,这是关于二进制兼容性,而不是源代码兼容性。
【问题讨论】:
-
如何使用“新”结构?客户端代码需要在标头中声明 X。你要申报哪个X?归根结底,您不想这样做,这就是发明 COM 之类的东西的原因。
-
X在用于编译应用程序的标头中声明和定义。foobar()在标头中声明,但在共享库内的.cpp文件中定义。当然,如果X更改,应用程序将不会重新编译,因此不会“看到”标头更改。因此问题。 -
简短回答:不要这样做。长答案:你为什么要这样做?这里的真实情况是什么?
-
@Kerrek SB:在我的特殊情况下,这只是编写代码的最简单方法。还没有编写库和应用程序;我只是想知道如果
X发展,我是否可以写这个并且仍然保持二进制兼容性。好像不是这样,那我就换个方式写吧。不用担心。
标签: c++ binary-compatibility abi