将 C++ 从 VS2003 迁移到 VS2005 需要哪些代码更改?

Posted

技术标签:

【中文标题】将 C++ 从 VS2003 迁移到 VS2005 需要哪些代码更改?【英文标题】:What code changes are required to migrate C++ from VS2003 to VS2005? 【发布时间】:2008-11-13 09:48:37 【问题描述】:

我们正在考虑将我们的跨平台 C++ 应用程序的 win32 版本从 MS Visual Studio 2003 迁移到 MS Visual Studio 2005。(是的,我们非常具有前瞻性;)

我们是否应该期望进行许多代码更改才能使其编译和工作?

【问题讨论】:

【参考方案1】:

我刚刚通过 VS2005 将一个相对较大的代码库从 VS2003 迁移到 VS2008,我发现的大多数问题都是 const/non-const 问题,例如将返回 const char * 的函数的返回值分配给 char *。 VS2005 和 VS2008 在 const 正确性方面都更加挑剔,如果您现有的代码库在 const 正确性方面有点草率,抱歉,老派,您会看到很多这样的。

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

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

我们遇到的另一个问题是 MS 在 VS2005 或 VS2008 中更改了 time_t 的默认大小(我很抱歉,但我不记得了 - 它肯定在 VS2008 中,但它可能已经在 VS2005 中)所以如果你必须与在界面中使用 time_t 的旧库链接,您必须使用 _USE_32BIT_TIME_T 才能恢复到旧编译器的行为。

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

总的来说,我确实更喜欢 VS2005/8 到 VS2003,如果可以的话,我建议升级到 VS2008,因为编译器比 VS2005“更好”——MS 似乎在改进原生 C++ 方面付出了巨大的努力编译器。其中一部分在 2005 年就已经很明显了,因此即使您坚持 2005 年,您也至少会获得一些好处。

【讨论】:

【参考方案2】:

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

检查this article 并考虑这些更改对您现有代码的影响有多大。清理 for 循环一致性可能需要一些工作。

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

【讨论】:

你说得对,最常见的工作是在for循环内部声明的变量的外部使用; VS 2005 修复了这个问题并破坏了旧代码。【参考方案3】:

在决定是否以及如何开展此项目时,您应该查看 MS 的重大变更列表。

Breaking Changes VC 2005 - 2008

Breaking Changes in the Visual C++ 2005 Compiler

Breaking Changes in Visual C++ .NET 2003

【讨论】:

【参考方案4】:

你会发现很多字符串命令会给你警告,因为在 vis 2005 中他们加强了安全性以尝试停止缓冲区运行。

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

【讨论】:

通过定义 _CRT_SECURE_NO_WARNINGS 可以轻松禁用该警告 嗯,这是一个哲学问题。你不应该做的是使用 MS-only 的函数,这会破坏你的代码的可移植性。 这就是预处理器的用武之地。我用它来保留标准名称,但使用 os 函数进行跨平台编译【参考方案5】:

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

【讨论】:

太棒了,我们目前正在开展一个项目,从警告级别设置为 3 的 VC6 迁移到警告级别为 4 的 VC2008。我们不得不进行许多代码更改;大部分是次要的,但也有一些主要的,该项目现在已进入第二个月! 这是一个相当小的项目(请亲自查看@@codeplex.com/uptime),我当时就在努力注意标准合规性。【参考方案6】:

没有。我预计不会超过几个。

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

【讨论】:

【参考方案7】:

另外,请考虑禁用checked iterators,否则移植到新版本后性能可能会受到影响。

【讨论】:

【参考方案8】:

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

人们从旧版本的 VS 升级到新版本的主要问题是新版本更符合标准。

类似的东西:

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


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

【讨论】:

以上是关于将 C++ 从 VS2003 迁移到 VS2005 需要哪些代码更改?的主要内容,如果未能解决你的问题,请参考以下文章

将 C++ ATL 可执行应用程序从 VS2003 迁移到 VS2013

从 vb.NET (2003) 迁移到 vb2005 都有哪些好处?

将托管 C++ 从 vs2003 移植到 vs2008 的问题

如何将VS2003的XslTransform转换为VS2005的XslCompiledTransform?

将解决方案 C++ 从 VS2005 升级到 VS2012 出现错误 LNK1181

使用部分类和设计器文件将 Visual Studio 2003 表单转换为 Visual Studio 2005/2008 表单