考虑以下C ++代码:
struct X
{
int a;
int b;
};
X foobar()
{
X x = { 1, 2 };
return x;
}
现在假设此代码放在共享库中,该库由第三方应用程序使用。
我的问题是:如果我在X
末尾添加其他成员(例如int c
),并在foobar()
中对其进行初始化,则会调用foobar()
的现有应用程序打破?请注意,这是关于二进制兼容性,而不是源兼容性。
答案 0 :(得分:3)
这完全取决于你的编译器选择做什么(更具体地说,是ABI所要求的平台)。
你可以想象,如果将返回值放在堆栈上,你现在可以在堆栈上写入比调用者期望的更多的内容,这可能会导致对某些内容进行标记。
通常,您不应该依赖任何特定的行为。您只需重新编译客户端应用程序。唯一现实的替代方案就像PIMPL idiom。
答案 1 :(得分:3)
由于X的大小会改变,是的。数组等依赖于大小。你可能会“幸运”,填充可能允许较旧的应用程序使用较新的lib,但这将是纯粹的运气。