c - 在 GCC 4.4 中,使用 long double 传递 union 的 ABI 发生了变化

标签 c

我有一个带有长双字段的 union 。

我初始化一个字段并将其传递给一个函数。

my_union foo;
foo.long_double = 10.10;
bar = baz(foo);

编译这段代码时我得到:

the ABI of passing union with long double has changed in GCC 4.4

似乎与此处提到的更改有关:http://gcc.gnu.org/gcc-4.4/changes.html

这是否意味着我不能通过具有 long double as 字段的 union ?为什么是这样?我该如何解决这个问题,因为我想使用 long double 来存储大值。

最佳答案

这意味着生成的代码与使用以前版本的 GCC 编译的代码不二进制兼容,因此如果您在使用当前版本和以前版本编译的二进制文件之间的库之间传递它,它将无法工作。 (有关网络传输和保存到文件的内存布局的信息,请参阅评论)

从您提供的链接可以看出:

用以前版本的 GCC 构建的代码使用其中任何一个与用 GCC 4.4.0 或更高版本构建的代码不兼容。

要么不这样做,要么确保所有使用更改日志中提到的 union 的代码都在相同的编译器版本(或技术上 ABI)上编译。

http://en.wikipedia.org/wiki/Application_binary_interface

关于c - 在 GCC 4.4 中,使用 long double 传递 union 的 ABI 发生了变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16830928/

相关文章:

C main() 函数可以是静态的吗?

c - 如何使用linux c计算bash中光标前的字母?

c - 变量声明,使用 libuv

c++ - 在二叉树中,找出有多少祖父只有两个或三个孙子

c - 曼哈顿距离高估了,让我发疯

c - 我需要帮助来完成 C 中的嵌套 for 循环以产生特定的输出

c - 我的二进制文件中的这些额外字节是什么?

自定义 linux pcie 驱动程序 MSI 中断

c - 从缓冲区读取数据的最佳实践

c++ - libcurl 在 ubuntu 虚拟机上完美运行,但无法解析 Windows 上的主机