我需要使用 MSVC 开发一个 C++ 前端 GUI,它需要与使用 C++ Builder 编译的银行端库进行通信。
我们如何定义接口(interface)才不会遇到 CRT 库问题?
例如,我相信我们将无法安全地来回传递 STL 容器。是真的吗?
我知道我可以安全地传递 POD 类型,但我希望我也可以使用一些更复杂的数据结构。
最佳答案
您可能会发现这篇文章很有趣 Binary-compatible C++ Interfaces .一般的教训是,永远不要通过 STL 容器、boost 或类似的东西。与其他两个答案一样,您最好的选择是坚持使用指定调用约定的 POD 和函数。
由于 STL 的实现因编译器而异,因此传递 STL 类是不安全的。然后,您可以要求用户使用 STL 的特定实现(可能还有特定版本),或者干脆不在库之间使用 STL。
进一步坚持调用约定,其中行为可以被认为是友好的交叉编译器。例如 __cdecl
和 __stdcall
将在大多数编译器上得到同等处理,而 __fastcall
调用约定将是一个问题,特别是如果您希望使用C++ Builder 中的代码。
正如文章“二进制兼容的 C++ 接口(interface)”中提到的,您也可以使用接口(interface),只要您记住一些基本原则即可。
- 始终使接口(interface)成为纯虚拟类(即没有实现)。
- 确保对接口(interface)中的成员函数使用正确的调用约定(文章提到了适用于 Windows 的
__stdcall
。 - 在 DLL 边界的同一侧保持内存清理。
- 还有很多其他事情,比如不要使用异常,不要在接口(interface)中重载函数(编译器对此有不同的处理方式)等。在文章底部找到它们。
如果您选择使用 C++ 接口(interface),您可能需要阅读有关组件对象模型 (COM) 的更多信息,以了解它如何以及为何能够跨编译器工作。
关于c++ - 交叉编译库通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3864386/