我们说我有一个基于VC ++的可执行文件和库。为了保持两个组件的构建过程真正独立,我只能在两个二进制文件之间交换数据时使用普通的旧C类型。
例如,将std::string
从库返回到可执行文件是不可能的,因为新的MSVC运行时需要更新两个组件。因此,我不得不使用char*
类型。
但是,我想知道结构如何适应图片。如果我用C类填充它们,它们是否仍然符合ABI?或者结构是否采用某些技术,这些技术会使它们与类相提并论,从而使它们成为非ABI兼容的?如果我通过指针与普通返回类型返回这样的结构,它会有所不同吗?
感谢您的建议。
答案 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的每个版本发布版本......