gpt4 book ai didi

c - 在不同编译器生成的代码之间传递结构

转载 作者:行者123 更新时间:2023-12-01 09:24:10 26 4
gpt4 key购买 nike

结构的内存布局取决于编译器。那么当一个编译器编译的某些代码使用另一个编译器编译的代码生成的结构时会发生什么?

例如,假设我有一个声明结构 somestruct 的头文件和一个返回该结构的函数。一个源文件定义了该函数并由编译器A 编译。另一个源文件使用比函数,由编译器B编译并链接到另一个源文件的二进制文件。

如果两个编译器为 somestruct 创建了两种不同的布局,那么函数返回的变量的布局是什么?它是否遵循一个编译器的布局,或者当第二个源文件尝试访问第一个源文件返回的结构的元素时是否会出现内存错误?是编译时出错还是链接时出错?

最佳答案

函数将返回一个由函数编译器的 ABI 指定的结构。被调用者编译器只会将函数视为符合自身的ABI。

假设两个编译器使用相似 ABI,在大多数情况下,在编译时或链接时甚至在运行时都不会报告错误。对于某些兼容的编译器,例如 OS X 和 Linux 上的 Clang、GCC 和 Intel C Compiler,不会产生错误应该(如果有错误,则说明是编译器的错误)。然而,在现实世界中,通常很难找到完全兼容的编译器(在大多数情况下,它们的 ABI 相似但不完全相同;此类 ABI 错误将更难追踪,因为您的应用看起来很正常并且在运行时遇到一些非常奇怪的情况下崩溃)。

正如 Basile 所说,C++ 的名称修改在 ABI 中造成了额外的差异,但这种差异在编译时更容易被发现,因为链接器实际上无法找到函数的符号,而不是找到不兼容的功能。

此外,就 ABI 而言,传递结构是另一个令人头疼的问题,因为有多个结构打包 ABI,有时在 GCC/MinGW 和 MSVC 等“兼容”编译器中甚至不同。 (另请参阅 GCC 中的 -m[no-]ms-bitfields 选项,它强制 GCC 将 MSVC ABI 用于结构。)我还看到了一些通过指针传递结构的情况是 more reliable 比按值传递结构。

关于c - 在不同编译器生成的代码之间传递结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28398417/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com