假设下面的头文件对应,例如,一个共享库。导出的函数采用指向此 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? http://gcc.gnu.org/ml/libstdc++/2001-11/msg00063.html
- ABI 必须定义的东西 C++ ABI issues list
- 示例 C++ ABI 规范 http://sourcery.mentor.com/public/cxx-abi/abi.html
- ABI 如何在 Solaris 上发展 http://developers.sun.com/solaris/articles/CC_abi/CC_abi_content.html
无论如何,底线是您在平台/编译器 ABI 规范中寻找保证,而不是 C 标准。
关于C 结构对齐和跨编译器的可移植性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10298113/