gpt4 book ai didi

c++ - 交叉编译库通信

转载 作者:太空狗 更新时间:2023-10-29 20:18:30 25 4
gpt4 key购买 nike

我需要使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com