C 结构对齐和跨编译器的可移植性

标签 c windows portability

假设下面的头文件对应,例如,一个共享库。导出的函数采用指向此 header 中定义的自定义结构的指针:

// lib.h

typedef struct {
  char c;
  double d;
  int i;
} A;

DLL_EXPORT void f(A* p);

如果共享库是使用一个编译器构建的,然后从使用另一个编译器构建的 C 代码中使用,则它可能无法工作,因为内存对齐方式不同,如 Memory alignment in C-structs建议。那么,有没有办法让我的结构定义在同一平台上的不同编译器之间可移植?

我对 Windows 平台特别感兴趣(显然它没有明确定义的 ABI),但也很想了解其他平台。

最佳答案

TL;DR 在实践中你应该没问题。

C 标准没有对此进行定义,但平台 ABI 通常会进行定义。也就是说,对于给定的 CPU 架构和操作系统,可以定义 C 如何映射到允许不同编译器互操作的程序集。

结构对齐不是平台 ABI 必须定义的唯一内容,您还有函数调用约定和类似内容。

C++ 使其变得更加复杂,ABI 必须指定 vtables、异常、名称重整等。

在 Windows 上,我认为有多个 C++ ABI 取决于编译器,但 C 在大多数编译器之间是兼容的。我可能是错的,我不是 Windows 专家。

一些链接:

无论如何,底线是您在平台/编译器 ABI 规范中寻找保证,而不是 C 标准。

关于C 结构对齐和跨编译器的可移植性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10298113/

相关文章:

ruby - 如何在 U 盘上安装 Ruby Gems

windows - Perl Excel::Writer::XLSX-> new( 'myfile.xlsx' ) 在 Windows 8 环境中生成不适当的 I/O 错误

c++ - 带有 PNG/Alpha channel 图像的图像列表

C 基于用户输入的每行字符缩进

c - 将命令行给出的文件名保存在动态生成的字符串中

c - Windows命令: cannot get the input character properly

c++ - Qt 中的信号和槽到底是什么?

build - CMake 往返工作流程

C for Linux 中的崩溃报告

android - Android系统的GID/UID是什么?