c++ - 交叉编译库通信

标签 c++ visual-c++ c++builder cross-compiling

我需要使用 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),只要您记住一些基本原则即可。

  1. 始终使接口(interface)成为纯虚拟类(即没有实现)。
  2. 确保对接口(interface)中的成员函数使用正确的调用约定(文章提到了适用于 Windows 的 __stdcall
  3. 在 DLL 边界的同一侧保持内存清理。
  4. 还有很多其他事情,比如不要使用异常,不要在接口(interface)中重载函数(编译器对此有不同的处理方式)等。在文章底部找到它们。

如果您选择使用 C++ 接口(interface),您可能需要阅读有关组件对象模型 (COM) 的更多信息,以了解它如何以及为何能够跨编译器工作。

关于c++ - 交叉编译库通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3864386/

相关文章:

c++ - 用于求解最小可整除数的代码中的运行时错误

c++ - 为 ISO 8859-1 实现 basic_string<unsigned char>

c++ - 需要有关 BOOST_FOREACH/编译器错误的帮助

C++ 对每个新对象使用相同的 default_random_engine

c++ - 在 boost 图库中为深度优先搜索提供颜色图时遇到问题

c++ - __FILE__ 、 __LINE__ 和 __PRETTY_FUNCTION__ 的 Visual C++ 等效项

visual-c++ - 用循环优化除以零 VC++ 2015

ssl - DTLS 1.2 主 key 推导

delphi - TDBNavigator背景透明度颜色错误

delphi - CBuilder 中的 HTTP 服务器