用于升级 C++ 代码的 Visual Studio IDE 工具

Visual Studio 可帮助你使用编译器选项、代码分析警告和编辑器功能(如快速修复、快速信息以及增强的滚动条)升级旧 C++ 代码。 “旧代码”一词是指以下任一类别:

  • 以前由 Microsoft C++ 编译器 (MSVC) 允许但不再符合 C++ 标准的代码。

    若要升级不符合标准的较旧 MSVC 代码,请启用 /permissive- 编译器选项。 在代码编辑器中,所有不符合标准的用法实例都用红色波浪线下划线标出。 “错误列表”窗口中的错误消息包括有关如何修复错误的建议。 单击错误代码可转到文档中的帮助页。 如果同时修复所有错误是不切实际的,可以通过启用 /permissive- 选项、修复部分错误,然后再次禁用选项,分阶段升级不符合标准的代码。 代码将通过新的改进功能进行编译,你可以稍后返回并修复剩余的问题。 有关不符合标准的 MSVC 代码的示例,请参阅 /permissive- 页面。

  • 在早期版本的 C++ 标准中允许但在更高版本中已弃用或移除的代码。

    若要升级到较新的语言标准,请将 C++ 语言标准选项设置为所需的标准,并修复引发的任何编译错误。 一般情况下,我们建议将语言标准设置为 /std:c++17/std:c++20。 升级到较新的标准时引发的错误与使用 /permissive- 选项时引发的错误无关。

  • 符合标准的所有版本但不再被视为新式 C++ 中的最佳做法的代码。

    若要确定建议更改的代码,请运行代码分析

打开并转换旧项目

如果旧项目基于较旧版本的 Visual Studio,可以在 Visual Studio 2017 或 Visual Studio 2019 中将其打开。 Visual Studio 会自动将其转换为当前项目架构,并支持所有最新的编译器和 IDE 功能。

Screenshot of the Upgrade a project dialog.

有关详细信息,请参阅从早期版本的 Visual Studio 升级 C++ 项目

搜索代码库

升级代码库通常涉及到搜索多个文件。 若要在代码库中搜索任何内容,请按 Ctrl+T 调出“转到全部”搜索框。

Screenshot of the Go to all dialog.

若要缩小搜索范围,键入包含 1 个字母的筛选条件,然后键入一个空格,然后是要查找的内容。

错误列表

设置了所需的 C++ 语言标准和其他任何编译器选项(“项目”>“属性”>“常规”)后,按 Ctrl+Shift+B 编译项目。 你应该会在代码的各个位置看到一些红色波浪线形式的错误和警告。 错误也会显示在“错误列表”中。 有关具体错误的详细信息,请单击错误代码以转到文档中的帮助页。 以“C”开头的错误代码是编译器错误。 以“MSB”开头的代码是指示项目配置出现问题的 MSBuild 错误。

Screenshot showing compiler and MSBuild errors in Error List.

文档运行状况指示器

编辑器底部的文档运行状况指示器显示当前文档中的错误数和警告数,你可以直接逐个浏览警告/错误。

Document health indicator.

在许多情况下,可以在记录 Visual Studio 更改历史记录和符合性改进的文档中找到有关具体错误的详细信息。

使用代码分析实现代码现代化

升级时,建议对项目运行代码分析,使代码至少符合 Microsoft 本机建议规则。 这些规则是 Microsoft 定义的规则和一部分 C++ Core Guidelines 的组合。 符合这些规则之后,可以大大减少或消除常见的 bug 来源,同时使代码的可读性更强,从而更易于维护。 默认情况下,使用 Microsoft 本机建议规则的 Code Analysis 处于启用状态。 你可以在“项目”>“属性”>“代码分析”下启用其他规则。 违反其中一条规则的代码将被标记为警告,并在代码编辑器中用绿色波浪线下划线标出。 将鼠标悬停在波浪线上,可以看到描述问题的快速信息工具提示。

Screenshot of a Code analysis tooltip.

单击“代码”列中的筛选器图标可选择显示哪些警告。

Screenshot of Code analysis filters in Error List.

代码分析错误和警告也像编译器错误一样出现在错误列表中。

Screenshot of Code analysis warnings in Error List.

可以更改使哪些规则处于活动状态,并创建自定义规则集。 有关使用代码分析的详细信息,请参阅 C/C++ 代码分析概述

使用快速操作使代码实现现代化

代码编辑器为一些常见的建议提供了快速操作。 在显示灯泡图标时,可以单击它以查看可用的快速操作。

将宏转换为 constexpr 函数

下图显示了名为 AVERAGE 的宏的使用情况,它具有默认的语义着色。 该图像还显示了当鼠标光标悬停在它上方时显示的快速信息工具提示:

Screenshot of a QuickInfo macro expansion.

由于新式 C++ 中不建议使用宏,使用 Visual Studio 可以轻松地将宏转换为 constexpr 函数:

  1. 右键单击 AVERAGE 并选择“转到定义”

  2. 单击螺丝刀图标,然后选择“将宏转换为 constexpr”

    Screenshot of a Quick Action macro to constexpr.

这将对宏进行转换,如下所示:

Screenshot of a constexpr function.

现在,对 AVERAGE 的调用被着色为一个函数调用,快速信息工具提示显示推断出的函数类型:

Screenshot of a constexpr function call.

初始化变量

未初始化的变量可能包含会导致严重 bug 的随机值。 代码分析标记这些实例,编辑器提供快速操作:

Screenshot of the pop-up for an uninitialized variable.

转换为原始字符串文本

与具有嵌入转义字符的字符串相比,原始字符串字面量更不容易出错,而且键入起来也更方便。 右键单击字符串,然后选择“快速操作”将其转换为原始字符串字面量。

Raw string literal.

字符串被转换为 R"(C:\Users\bjarnes\demo\output.txt)"