自 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 风格的强制转换仍然是合法的,具有它们一直以来的相同语义,但是在新代码中,你会想要避免它们,至少在涉及指针或引用时。 )