C++ 和二进制兼容性 : returning a POD struct by value

标签 c++ binary-compatibility abi

考虑以下 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/

相关文章:

c++ - 从新的和不同的发行版加载 LD_PRELOAD libstdc++.so.6 和 libc.so.6 时出现浮点异常

c++ - 更改此 makefile 以便它自动将目录中的所有文件视为依赖项?

c++ - 通过函数遍历c数组

GCC 目标特异性和二进制兼容性

boolean - opencl支持 boolean 变量吗?

c++ - 将右值传递给非引用参数,为什么编译器不能删除拷贝?

c++ - static const char* 上的 LINK 错误

java - 删除 "final"关键字会影响二进制兼容性吗?

c++ - __cdecl 或 __stdcall 在 Windows 上?

c - 在使用堆栈方面,为什么我们需要一个基指针和一个堆栈指针