迁移C++;从VS2003到VS2005? 我们正在考虑将我们的跨平台C++应用程序的Win32构建从MS Visual Studio 2003移到MS VisualStudio 2005。(是的,我们很有前瞻性;)

迁移C++;从VS2003到VS2005? 我们正在考虑将我们的跨平台C++应用程序的Win32构建从MS Visual Studio 2003移到MS VisualStudio 2005。(是的,我们很有前瞻性;),c++,visual-studio-2005,migration,visual-studio-2003,C++,Visual Studio 2005,Migration,Visual Studio 2003,我们是否应该期待大量的代码更改以使其编译和工作?不。我不会期望更多 编辑:您应该/可以先试用vs2005演示版的代码。您会发现许多字符串命令会向您发出警告,因为在vis 2005中,它们提高了安全性,尝试停止缓冲区溢出运行 不过,您的2003代码仍然可以编译。如果您的代码已经非常干净,并且在没有警告的情况下编译,那么这并不是一个很大的步骤 检查并考虑这些变化对你现有代码的影响有多大。清理循环一致性可能需要一些工作 您可以获得Visual Studio 2005的免费快速版。我最近将一个已有10年

我们是否应该期待大量的代码更改以使其编译和工作?

不。我不会期望更多


编辑:您应该/可以先试用vs2005演示版的代码。

您会发现许多字符串命令会向您发出警告,因为在vis 2005中,它们提高了安全性,尝试停止缓冲区溢出运行


不过,您的2003代码仍然可以编译。

如果您的代码已经非常干净,并且在没有警告的情况下编译,那么这并不是一个很大的步骤

检查并考虑这些变化对你现有代码的影响有多大。清理循环一致性可能需要一些工作


您可以获得Visual Studio 2005的免费快速版。

我最近将一个已有10年历史的VC6程序转换为VS2008。它不需要更改源代码,升级向导处理了对项目文件所需的唯一更改。

我刚刚通过VS2005将一个相对较大的代码库从VS2003迁移到VS2008,我发现的大多数问题都是常量/非常量问题,比如将返回常量字符*的函数的返回值分配给字符*。VS2005和VS2008在const正确性方面都要挑剔得多,如果您现有的代码库在const正确性方面有点马虎,对不起,老派,您会看到很多这样的情况

一个非常受欢迎的变化是,VS2005中的模板支持明显优于VS2003(它本身是对早期版本的一个重大改进),这使我能够为模板相关的问题提供一些解决方法,这些问题是团队自VC++4.x的令人兴奋的日子以来一直在拖延的

您可能会遇到的一个问题是关于“不推荐使用”或“不安全”函数的大量警告,尤其是在使用C字符串函数时。其中很多都是“被微软弃用的”(只是它们省略了“被微软”的部分),并且仍然是完全可用的,但它们是已知的缓冲区溢出的潜在来源。在我转换的项目中,我设置了预处理器define _CRT _SECURE _NO _警告,并禁用了警告C4996以关闭这些有点烦人的消息

我们遇到的另一个问题是MS在VS2005或VS2008中更改了默认的时间大小(抱歉,我不记得了-它肯定在VS2008中,但可能已经在VS2005中了),因此如果您必须链接到在界面中使用时间的旧库,您必须使用32位时间来恢复到旧编译器的行为

如果您的解决方案包含多个项目,您可能会发现并行生成功能(默认情况下启用)将突出显示缺少的生成依赖项。因此,项目突然以错误的顺序构建,但如果您从并行构建恢复到线性构建,则可以神奇地正确构建


总体上,我更喜欢VS2005/8到VS2003,如果这是一个选项,我建议升级到VS2008,因为编译器比VS2005更好,所以MS在改进本机C++编译器方面做了大量的努力。其中的一部分在2005年已经很明显了,所以即使你坚持到2005年,你也至少会得到一些好处。

在决定是否和如何进行该项目时,你应该查看微软的突破性变化列表


< P>,在移植到新版本后,CaseDead禁用或性能可能会受到影响。

< P>如果您的源代码符合C++标准,则不需要更改任何内容以移动到2005。您可能会收到一些贬值的警告,但不会出现编译错误

人们从旧版本的VS转向新版本的主要问题是,新版本更符合标准

例如:

for(i = 0; i < length; ++i)
{
}
for(i=0;i

i
在该点之前未定义时,在早期版本的VS中可以正常工作,但在2005年,它正确地将i标记为未定义变量。

通过定义“CRT\u SECURE\u NO\u WARNINGSWell,很容易禁用该警告。这是一个哲学问题。你不应该使用只使用MS的函数,这会影响代码的可移植性。这就是预处理器的作用。我使用它来保留标准名称,但使用os函数进行跨平台编译。没错,最常见的工作是在for循环中声明变量的外部使用;VS2005修复了这一问题,并打破了旧代码。令人惊讶的是,我们目前正在进行一个项目,从警告级别设置为3的VC6迁移到警告级别为4的VC2008。我们不得不进行许多代码更改;大部分是次要的,但也有一些主要的,项目现在已经进入第二个月了!这是一个相当小的项目(请看你自己),即使在那时,我也在努力对标准合规性保持谨慎。