Visual studio MSVC+中std::type_info的前向兼容性是什么+;?

Visual studio MSVC+中std::type_info的前向兼容性是什么+;?,visual-studio,dll,compatibility,Visual Studio,Dll,Compatibility,我知道我们不应该混合使用不同版本的MSVC++编译的代码,除非完全隔离语言运行时,就像在proc服务器中使用COM一样 但有些人认为他们可以做到,而且向前兼容性不是你可以提前几年保证的。特别是,此库(2006年)使用的方案允许一个DLL跨具有不同编译选项和RTL动态/静态选择的调用方工作,因为动态库始终命名为msvcrt.DLL。现在不是这样,所以处理它是一个挑战。但这不是发帖的原因 每个人都会考虑堆函数(malloc、free、operator new等)和跨DLL边界传递指针。但我看到了一些

我知道我们不应该混合使用不同版本的MSVC++编译的代码,除非完全隔离语言运行时,就像在proc服务器中使用COM一样

但有些人认为他们可以做到,而且向前兼容性不是你可以提前几年保证的。特别是,此库(2006年)使用的方案允许一个DLL跨具有不同编译选项和RTL动态/静态选择的调用方工作,因为动态库始终命名为
msvcrt.DLL
。现在不是这样,所以处理它是一个挑战。但这不是发帖的原因

每个人都会考虑堆函数(malloc、free、operator new等)和跨DLL边界传递指针。但我看到了一些根本没有被解决的问题。也就是说,头文件使用
std::type_info
来存储类型化的值(类似于locale facets或Boost.Any),因此隐式假设是调用方(使用VS10)可以创建包含
std::type_info
值的类的实例,以及预构建DLL(使用一些旧版本的编译器)我能理解他们

正如我以前查看
type_info
的实现时所回忆的那样,它使用低效的字符串比较来跨越链接器边界。但这只允许将重复的静态常量视为等效的—它仍然要求类型_info的底层实现是相同的

因此,是否有人碰巧知道,对于不同版本的Visual Studio提供的不同版本的RTL,结构的实现和其中字段的解释是否已更改或仍然相同?无论哪种方式,我都想听听经验,即使没有明确的答案


我还看到在标题中使用了
std::string

在尝试调试版本时,我发现Visual Studio 2005(版本8)和VS 2010(版本10)之间不兼容
std::string
。数据指针的位置尤其不同。因此,使用VS2005编译的代码无法正确解释VS2010创建的
std::string

我相信发布版本也是如此。我记得<>代码> STD::String ,特别是与微软的库中一般的STL容器不同,它与某些运行时检查选项更兼容,因此它不仅仅是编译器开关的细节,即使在C++编译器是同一版本时也总是兼容的问题。p> 我没有了解std::type_info,但这样一个问题足以拒绝相互兼容

我想提醒大家,避免实际传递字符串和使用ABI上兼容的调用有一个隐藏的问题:默认参数。默认参数是由调用方自动构造和传递的,您可能不知道在移植旧代码或诸如此类的东西时存在这样一个可选参数

当心不透明的预构建产品DLL,即使业务团队出于某种原因认为它很有吸引力。十年后,“他们”可能不再支持该产品,随着意外情况的改变,向前兼容性的计划将逐渐失败