【发布时间】:2010-10-05 14:04:41
【问题描述】:
我需要使用 MSVC 开发一个 C++ 前端 GUI,它需要与使用 C++ Builder 编译的银行端库进行通信。
我们如何定义我们的接口,以免遇到 CRT 库问题?
例如,我相信我们将无法安全地来回传递 STL 容器。这是真的吗?
我知道我可以安全地传递 POD 类型,但我希望我也可以使用一些更复杂的数据结构。
【问题讨论】:
标签: c++ visual-c++ c++builder cross-compiling
我需要使用 MSVC 开发一个 C++ 前端 GUI,它需要与使用 C++ Builder 编译的银行端库进行通信。
我们如何定义我们的接口,以免遇到 CRT 库问题?
例如,我相信我们将无法安全地来回传递 STL 容器。这是真的吗?
我知道我可以安全地传递 POD 类型,但我希望我也可以使用一些更复杂的数据结构。
【问题讨论】:
标签: c++ visual-c++ c++builder cross-compiling
您可能会发现这篇文章很有趣Binary-compatible C++ Interfaces。一般的教训是,永远不要通过 STL 容器、boost 或类似的东西。与其他两个答案一样,您最好的选择是坚持使用具有指定调用约定的 POD 和函数。
由于 STL 的实现因编译器而异,因此传递 STL 类是不安全的。然后,您可以要求用户使用 STL 的特定实现(也可能是特定版本),或者干脆不在库之间使用 STL。
进一步坚持调用约定,其中行为可以被视为友好的交叉编译器。例如,__cdecl 和 __stdcall 在大多数编译器上都会得到同等处理,而 __fastcall 调用约定将是一个问题,尤其是如果您希望在 C++ Builder 中使用代码。
正如文章“与二进制兼容的 C++ 接口”所述,只要记住一些基本原则,您也可以使用接口。
__stdcall for Windows。如果您选择使用 C++ 接口,您可能需要阅读有关组件对象模型 (COM) 的更多信息,以了解它如何以及为什么能够跨编译器工作。
【讨论】:
您应该能够传递可以通过 C 接口(即 POD)安全传递的数据。常规 C 或 C++ 函数调用传递的 POD 之外的所有内容都会遇到不同的对象布局和运行时库的不同实现的问题。
如果您非常注意如何在内存中布置 POD 结构并确保两个编译器使用相同的数据打包等,您可能能够传递 POD 结构。除了 C 结构之外,您几乎还有一个小溪/桨问题。
为了传递更复杂的数据类型,我会研究对象组件技术,如 COM、CORBA 或其他允许您进行远程或跨进程函数调用的技术。这些将解决在编译器和进程之间编组数据的问题,从而解决您的“仅 pod”问题。
或者您可以使用 C++-Builder 编写前端,这样可以省去很多麻烦和头痛。
【讨论】:
我在传递 STL 容器时遇到了问题,即使使用相同的 STL 实现,但设置了不同级别的调试信息等。因此传递 POD 就可以了。 C++ 容器几乎肯定会导致问题。
【讨论】: