考虑以下 C++ 代码:
struct X
{
int a;
int b;
};
X foobar()
{
X x = { 1, 2 };
return x;
}
现在假设这段代码放在共享库中,供第三方应用程序使用。
我的问题是:如果我在 X
的末尾添加另一个成员(例如 int c
),并在 foobar()
中初始化它>,调用 foobar()
的现有应用程序会中断吗?请注意,这是关于二进制兼容性,而不是源代码兼容性。
最佳答案
这完全取决于您的编译器选择做什么(更具体地说,平台 ABI 规定的内容)。
您可以想象,如果将返回值放在堆栈上,您现在向堆栈写入的内容会比调用者预期的多,这可能会导致在某些东西上加盖戳记。
一般来说,您不应依赖任何特定行为。您只需重新编译客户端应用程序。唯一现实的选择是像 PIMPL idiom 这样的东西。 .
关于C++ 和二进制兼容性 : returning a POD struct by value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6282074/