1

考虑以下 C++ 代码:

struct X
{
        int a;
        int b;
};

X foobar()
{
        X x = { 1, 2 };
        return x;
}

现在假设这段代码被放在一个共享库中,供第三方应用程序使用。

X我的问题是:如果我在(例如)末尾添加另一个成员int c,并在 中对其进行初始化,调用中断foobar()的现有应用程序会吗?foobar()请注意,这是关于二进制兼容性,而不是源代码兼容性。

4

2 回答 2

3

这完全取决于您的编译器选择做什么(更具体地说,平台 ABI 规定的内容)。

您可以想象,如果将返回值放在堆栈上,那么您现在在堆栈上写入的内容将比调用者预期的要多,这可能会导致在某些东西上加盖印记。

一般来说,你不应该依赖任何特定的行为。您只需重新编译客户端应用程序。唯一现实的选择是像PIMPL idiom之类的东西。

于 2011-06-08T16:28:56.117 回答
3

由于 X 的大小会改变,是的。数组等取决于大小。您可能会得到“幸运”,并且填充可能允许旧应用程序使用较新的库,但这纯粹是运气。

于 2011-06-08T16:29:21.880 回答