C结构符合ABI标准吗?

时间:2014-08-19 20:42:23

标签: c++ c struct abi

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

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

但是,我想知道结构如何适应图片。如果我用C类填充它们,它们是否仍然符合ABI?或者结构是否采用某些技术,这些技术会使它们与类相提并论,从而使它们成为非ABI兼容的?如果我通过指针与普通返回类型返回这样的结构,它会有所不同吗?

感谢您的建议。

2 个答案:

答案 0 :(得分:2)

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

如果这不起作用,你再也不能使用c ++中的任何c库了。无法相信这种情况会成真: - )

您必须使用extern "C"注意名称解析,并且不要使用打包选项手动更改数据结构的布局。那就是它!

答案 1 :(得分:0)

以下是这个问题的问题......如果你问这个问题,你可能正在做一些不可移植的事情,比如使用struct / union / variable进行字节顺序切换等等......所以一旦你是在这片土地上,你基本上只能期望它在你为单元测试编写的系统上工作...

对于标准ABI,在C中,您经常会为您的架构找到一个ABI,或者至少每个arch / object格式组合...

因此对于x86_86,您可以在几乎所有POSIX世界中找到一个ABI ... ABI指定了如何打包结构的内容,因此您可以构建在这些"普通系统上运行非常一致的代码&#34 ;但它不会成为"便携式"或者"标准" ...但这对你来说可能并不重要。

对于C ++来说,它几乎是狂野的西部,你甚至不能保证在相同编译器的不同版本之间低于语言水平的东西......它不像过去那样糟糕,但是你仍然会不时地看到问题,这就是为什么图书馆供应商仍然可以为VS的每个版本发布版本......