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

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

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

随后的讨论和您的评论帮助我认识到获得新编译器是强制性的 - 或者基本上它们是促使我行动的最后 Spark 。经过一个月的公司内部“游说”,我终于得到了 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 文件。因此至少我将能够通过新编译器打开文件。仍然可能不支持某些强制转换或类定义,我想大致了解调试时要查找的内容:)

最佳答案

自从 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 ,在这种情况下,它将返回 that,而不是 本地的)。

IIRC,VC 6.0 在强制访问方面也不是很严格 控制和常量。迁移时这可能不是问题, 然而,由于 VC 2012 在某些方面仍然未能符合 C++98 更公然的情况,至少使用默认选项。 (您仍然可以将临时引用绑定(bind)到非常量引用,例如 示例。)

另一个不向后兼容的重大语言更改 是模板中的名称查找。然而,即使在 VC 中也是如此 2012 年,微软实现了预标准名称查找(以及 我的意思是 C++98 之前的版本)。如果你想的话,这是一个严重的问题 将您的代码移植到其他编译器,但这确实使迁移 从 VC 6.0 到 VC 2012 容易多了。

关于库,我不记得是否是6.0 支持 C++98 库,或者是否仍然 预标准(或者可能两者都支持)。如果你的代码有 类似 #include <iostream.h>在其中,做好一些准备 这里的差异:直接使用 << 的细微差别和 >> ;主要如果你实现一些复杂的streambuf 。和 当然,所有库都从全局 namespace 移至 std:: .

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

关于c++ - Visual Studio 6.0 和 VS 2010 编译器之间的主要区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15543190/

相关文章:

代码可以停止使用编译器优化

对其资源使用源代码管理的 c++ 编译器

c - c中printf中的多个赋值语句

c++ - 断开qt定时器进行单元测试

c# - for中的多个语句

c# - VS2010安装项目升级及快捷键

c# - 如何为超过 1 个项目创建 msi 项目

c++ - 来自 2 个摄像头(用于立体视觉)的视频使用 OpenCV,但其中一个滞后

c++ - 如何在 Qt 中为每个工具栏部分提供标题

c++ - 可变参数模板 - 递归函数 - 最后一个可变参数成员