2

几个月前,我发布了以下问题 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 文件。因此,至少我将能够通过新编译器打开文件。仍然可能不支持某些强制转换或类定义,我想大致了解调试时要查找的内容:)

4

1 回答 1

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 在执行访问控制和 const 方面也不是很严格。但是,在迁移时这可能不是问题,因为 VC 2012 在某些更明显的情况下仍然无法符合 C++98,至少在默认选项下是这样。(例如,您仍然可以将临时对象绑定到非常量引用。)

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

关于库,我不记得 6.0 是否支持 C++98 库,或者它是否仍然是预标准(或者可能同时支持两者)。如果你的代码中有类似#include <iostream.h>的东西,请准备好这里的一些差异:minor for direct forward use of <<and >>; 主要如果你实现一些复杂streambuf的 . 当然,所有的库都从全局命名空间移到了 std::.

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

于 2013-03-21T09:44:35.710 回答