我需要使用MSVC开发一个C++前端图形用户界面,它需要与使用C++生成器编译的银行端库进行通信。
我们如何定义我们的接口,使我们不会遇到CRT库问题?
例如,我相信我们将无法安全地来回传递STL容器。这是真的吗?
我知道我可以安全地传递POD类型,但我希望我也能使用一些更复杂的数据结构。
发布于 2010-10-07 19:05:26
您可能会发现这篇文章很有趣,Binary-compatible C++ Interfaces。通常的教训是,永远不要传递STL容器、boost或任何类似的东西。与其他两个答案一样,您最好的选择是坚持使用指定了调用约定的PODs和函数。
由于STL的实现因编译器而异,因此传递STL类是不安全的。然后,您可以要求用户使用STL的特定实现(可能还有特定的版本),或者干脆不在库之间使用STL。
此外,坚持调用约定,在这种情况下,行为可以被认为是友好的交叉编译器。例如,__cdecl和__stdcall将在大多数编译器上同等处理,而__fastcall调用约定将是一个问题,特别是如果您希望在C++生成器中使用代码的话。
正如“二进制兼容的C++接口”一文中提到的,只要你记住一些基本原则,你也可以使用接口。
__stdcall for Windows.dll如果您选择使用C++接口,您可能希望阅读有关组件对象模型(COM)的更多信息,以了解这将如何以及为什么能够在编译器之间工作。
发布于 2010-10-05 22:16:58
您应该能够传递可以通过C接口安全传递的数据,换句话说,就是PODs。常规C或C++函数调用传递的PODs之外的所有内容都会遇到不同的对象布局和运行时库的不同实现的问题。
如果你非常注意如何在内存中放置PODs的结构,并确保两个编译器使用相同的数据打包等,那么你可能能够传递PODs的结构。除了C结构之外,你很可能会遇到creek/paddle问题。
为了传递更复杂的数据类型,我将研究对象组件技术,如COM、CORBA或其他允许您进行远程或跨进程函数调用的技术。这将解决在编译器和进程之间编组数据的问题,从而解决您的“pod-only”问题。
或者你可以使用C++-Builder编写前端,这样可以省去很多麻烦和麻烦。
发布于 2010-10-05 22:19:57
我在传递STL容器时遇到了问题,即使使用相同的STL实现,但设置了不同级别的调试信息等。因此传递PODs就可以了。C++容器几乎肯定会导致问题。
https://stackoverflow.com/questions/3864386
复制相似问题