C结构符合ABI吗?

Are C structs ABI compliant?

本文关键字:ABI 结构      更新时间:2023-10-16

假设我有一个基于vc++的可执行文件和库。为了保持两个组件的构建过程真正独立,在两个二进制文件之间交换数据时,我只能使用普通的旧C类型。

例如,从库返回std::string到可执行文件是不可能的,因为新的MSVC运行时将需要更新两个组件。因此,我将不得不使用char*类型。

然而,我想知道结构体是如何适应这种情况的。如果我用C类型填充这些,它们仍然是ABI兼容的吗?或者该结构是否采用某些技术,使它们与类处于同等地位,从而使它们不符合abi ?如果我通过指针和普通返回类型返回这样一个结构体,会有什么不同吗?

谢谢你的建议。

可以保证您可以在c++代码中使用c编译的c结构。这是在c++代码中使用c库的基础。例如,您可以使用posix api数据结构,从c++代码中填充它们,并将其与c++代码中的c函数一起使用。

如果这不起作用,你就再也不能使用c++中的任何c库了。真不敢相信这一幕会成真:-)

您必须注意extern "C"的名称需求,不要手动更改数据结构的布局与打包选项。就是这样!

这个问题是这样的…如果你问这个问题,你可能正在做一些不可移植的东西,比如使用结构体/联合/变量来做字节顺序切换或其他…因此,一旦你进入了这片土地,你基本上只能期望它在你为之编写单元测试的系统上工作…

对于标准ABI,在C中,您通常会为您的体系结构找到单个ABI,或者至少每个arch/object格式组合…

所以对于x86_86,你可以找到一个适用于几乎所有POSIX世界的ABI…ABI指定了诸如如何打包结构体之类的东西,因此您可以构建在这些"正常系统"上运行得相当一致的代码,但它不会是"可移植的"或"标准的"……但这对你来说可能并不重要。

对于c++来说,

几乎是一个蛮荒的西部,你甚至不能保证相同编译器的不同版本之间的东西低于语言级别……它不像以前那么糟糕了,但你仍然会时不时地看到问题,这就是为什么库供应商仍然会为每个版本的VS提供版本…