Microsoft Visual C ++向后兼容性

时间:2011-04-19 15:53:20

标签: visual-studio visual-c++ backwards-compatibility

考虑将C ++ API定义为一系列__options(declexport/import)类。

此外,假设永远不允许调用者在这些类上调用普通的operator new(size_t)。静态工厂方法可以执行新操作,也可以使用特定于类的operator new。并根据需要在删除大小上标记(通常只是一个虚拟析构函数)。

现在,如果您使用VS2010中的工具编译和链接DLL和IMPLIB,是否可以将该implib和DLL交给VS2005的用户并期望它能够正常工作?

根本不涉及MFC。

我特别感谢任何关于该主题的任何相对正式的微软声明的提及。

2 个答案:

答案 0 :(得分:2)

只要C ++ API上的名称相同(它们是),并且不使用STL类型的特定参数,例如basic_stringstd::map,其实现可能在编译器的版本(他们有),然后它应该工作。

当然,您需要确保使用/MT模式(静态链接运行时)编译DLL,或者使用提供的库和链接目标包含VS2010运行时的可再发行组件。

编辑:扩展“不要传递具有版本特定实现的类型”。通过查看MSVC100P.DLL的导出输出,可以轻松找到部分列表。

cd %VS100COMNTOOLS%\..\VC\redist\x86\Microsoft.VC100.CRT
DUMPBIN /exports MSVCP100.DLL

下一个问题将是mapset之类的仅限标头的实现,这些实现在编译器版本之间已经发生了变化。

这就是为什么强烈建议只有标量类型跨越内存竞技场之间的边界。因此,简单的测试将通过并且可靠。

答案 1 :(得分:1)

你没有提到你是否已经使用MFC来创建DLL。如果你有,常规DLL应该可以工作,但我不认为扩展应该工作,因为后者链接到MFC dll。我包括链接供你参考。

http://www.codeguru.com/cpp/cpp/cpp_mfc/tutorials/article.php/c4017

http://www.experts-exchange.com/Programming/System/Windows__Programming/MFC/Q_20385543.html

http://msdn.microsoft.com/en-us/library/26h8x9sy%28v=VS.100%29.aspx

修改 如果它是一个普通的DLL,应该没有任何问题。也取决于链接类型。