在我的公司,我们最近从 VC9 切换到 VC10。
我们迁移了我们的项目,但是负责人告诉我们,我们必须在我们的生产机器上保留一些用 VC9 编译的基本通用 DLL 一段时间。
这些 DLL 使用自定义结构,其中一些包含std::vector
, std::map
等等。现在,我注意到标准容器的尺寸发生了变化:有些变大了,有些变小了。因此,我们定制结构的尺寸也发生了变化。
为了解决大小变化引起的问题,我的一位同事想到人为地增加结构体的大小,以便能够补偿未来成员大小的变化,以便无论我们使用什么运行时,结构体都保持相同的大小,从而防止堆栈函数调用损坏。
就我个人而言,我觉得这个“解决方案”很糟糕,因为虽然尺寸很重要,但结构的布局也很重要。对我来说,增加所有结构的内存占用来解决组织问题似乎是错误的。
简而言之,我的问题是:在函数原型中使用非 C 类型时是否可以同时使用两个不同的运行时(使用所描述的技巧或任何其他技巧)?对于类似的情况,您有什么好的/坏的经历吗?
STL 从来不保证不同主要版本之间的二进制兼容性。因此,如果您在接口上有带有 STL 类的 DLL,则应该为 DLL 的客户端和 DLL 本身使用相同的编译器和相同风格的 CRT。
如果您想构建可以安全地与不同编译器版本一起使用的 DLL,您有一些选择,例如:
- 曝光一个pure C接口(DLL可以用C++编写,但接口必须是纯C的,并且C++异常不能跨越DLL边界)。
- Expose 抽象接口在 DLL 接口处,如本节所述article http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx.
- Use COM.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)