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

Rom*_*n L 10 c windows portability

假设以下头文件对应于例如共享库.导出的函数获取指向此标头中定义的自定义结构的指针:

// lib.h

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

DLL_EXPORT void f(A* p);
Run Code Online (Sandbox Code Playgroud)

如果共享库是使用一个编译器构建的,然后是从使用另一个编译器构建的C代码中使用的,那么由于不同的内存对齐可能无法工作,因为C-struct中的内存对齐表明.那么,有没有办法让我的结构定义可以在同一平台上的不同编译器中移植?

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

Hav*_*c P 13

TL; DR在实践中你应该没事.

C标准没有定义这个,但ABI通常会这样做.也就是说,对于给定的CPU体系结构和操作系统,可以定义C如何映射到汇编,以允许不同的编译器进行互操作.

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

C++使它变得更加复杂,ABI必须指定vtable,异常,名称修改等.

在Windows上我认为有多个C++ ABI取决于编译器,但C大多数兼容编译器.我错了,不是Windows专家.

一些链接:

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