Visual Studio 6.0和VS 2010编译器之间的主要区别

时间:2013-03-21 09:05:05

标签: c++ visual-studio-2010 compiler-construction

几个月前,我发布了以下问题 Problem with templates in VS 6.0

接下来的讨论和你的评论让我意识到,开始使用新的编译器是强制性的 - 或者基本上它们是让我开始行动的最终火花。经过一个月的公司内部“游说”,我终于获得了VS 2012! (谢谢你们)

我必须使用的几个旧工具是用VS 6.0开发的 我担心的是,其中一些工具可能无法与新的编译器一起使用。这就是为什么我想知道这里是否有人能够指出VS 6和VS 2012之间的主要差异 - 或者至少是VS 6和VS 2010之间的差异 - 从2010年到2012年的变化都是在线的文档。

显然,VS 6.0和VS 12之间的差异必定是巨大的...我主要关注的是像演员等基本的事情。网上几乎没有关于VS 6.0的任何信息 - 我有点不知所措:(

我想我必须用相同的类创建新项目。在第二步中,我将使用旧工具覆盖.h和.cpp文件。因此,至少我将能够通过新的编译器打开文件。仍然可能不支持某些强制转型或类定义,我想在调试时大致了解要查找的内容:)

1 个答案:

答案 0 :(得分:4)

自VS 6.0问世以来,该语言已经有了很大的发展。 VS6.0是预C ++ 98; VS 2012是C ++ 03,其中包含一些功能 C ++ 11。

大多数较新的语言功能都向上兼容; 旧代码仍应有效。仍然,VC 6.0是预先标准的, 并且委员会不太关心破坏现有的情况 代码没有以前的标准(和实现 确实有所不同)。该语言有几个方面(至少) 这可能会导致问题。

首先,VC 6.0仍然使用旧的范围 for中定义的变量。因此,在VC 6.0中,如下所示 是合法的:

int findIndex( int* array, int size, int target )
{
    for ( int i = 0; i < size && array[i] != target ; ++ i ) {
    }
    return i;
}

这不会在VC 2012中编译(除非还有全局 变量i,在这种情况下,它将返回那个,而不是 当地人)。

IIRC也是如此,VC 6.0在执行访问方面并不是非常严格 控件和常量。这可能不是迁移时的问题, 但是,因为VC 2012仍然无法在某些方面符合C ++ 98 更公然的情况,至少是默认选项。 (您仍然可以将临时绑定到非const引用,for 例子。)

另一种主要的语言变化,它不向后兼容 是模板中的名称查找。然而,这也是在VC中 2012年,微软实施了pre-standanrd名称查询(和 我的意思是预C ++ 98)。如果你愿意,这是一个严重的问题 将您的代码移植到其他编译器,但它确实进行迁移 从VC 6.0到VC 2012要容易得多。

关于图书馆,我不记得是否6.0 支持C ++ 98库,或者它是否仍然存在 预标准(或可能同时支持)。如果您的代码有 像#include <iostream.h>这样的东西,为一些人做好准备 这里的差异:对于<<>>的直接使用是次要的 streambuf;如果您实现一些复杂的std::,则为major。和 当然,所有的库都从全局命名空间移到了 {{1}}。

其余的:您的代码显然不会使用任何功能 VC 6.0出现后推出。这不会导致迁移 问题(因为仍然支持较旧的功能),但是 你无疑会想要回去,并逐步升级 您迁移后的代码。 (你提到演员。这是 一个很好的例子:C风格的演员阵容仍然是合法的,具有相同的 他们一直有的语义,但在新的代码中,你会想要的 避免它们,至少涉及指针或引用时。)