Visual Studio 2022 中的 C++ 新变化
Visual Studio 2022 带来了针对 Microsoft C++ 编译器和工具的许多更新和修补程序。 Visual Studio IDE 还在性能和工作效率方面进行了重大改进,而且现在作为 64 位应用程序本机运行。
- 有关整个 Visual Studio 中新增功能的详细信息,请参阅 Visual Studio 2022 中的新增功能。
- 有关 C++ 文档中新增功能的信息,请参阅 Microsoft C++ 文档:新增功能。
- 有关版本生成日期的信息,请参阅 Visual Studio 2022 发布历史记录。
Visual Studio 版本 17.12 中C++的新增功能
发布日期:2024 年 11 月
有关 | 请参阅 |
---|---|
面向 C++ 开发人员的新增功能 | Visual Studio 2022 17.12 中面向C++开发人员的新增功能 |
标准库 (STL) 合并C++26 和 C++23 功能、LWG 问题解决方法、性能改进、增强行为和修复 bug | STL Changelog 17.12 |
Visual Studio 17.12 IDE 中的新功能 | Visual Studio 2022 版本 17.12 发行说明 |
Visual Studio 2022 17.12 中的C++语言一致性改进 | C++ Visual Studio 2022 17.12 中的一致性改进、行为更改和 bug 修复 |
一些新功能的快速突出显示:
- 标准库增强功能
- C++23 格式设置范围(P2286R8)实现完成。 为容器适配器
stack
添加了格式化程序,queue
以及priority_queue
。 - 添加了多维下标运算符,该运算符也支持
<mdspan>
。 例如:print("m[{}, {}]: '{}'; ", i, j, m[i, j])
。
- C++23 格式设置范围(P2286R8)实现完成。 为容器适配器
- C++中的游戏开发
- 直接在 Visual Studio 中打开 Unreal Engine 项目,而无需生成包装 Unreal Engine 项目的 Visual Studio 解决方案文件。 有关详细信息,请参阅 Visual Studio 中的“使用 Unreal Engine 项目”。
- 你可以指定要在直接从工具栏进行调试时传递的命令行参数。 有关详细信息,请参阅 为 Unreal Engine 项目设置命令行参数。
- 生成见解
- 可以在所选文件上运行 Build Insights。 在解决方案资源管理器中选择所需的文件,右键单击并选择“在所选文件上运行生成见解”:
- 可以按项目筛选 Build Insights 结果。 单击筛选器列标题上的筛选器按钮,然后选择要查看其结果的项目:
- 单击“生成见解”窗口中的问号图标可查看“生成见解”窗口中选项卡的简短说明,以及指向文档的链接以获取详细说明:
- GitHub Copilot
- 可以单击 变量值旁边的 Ask Copilot ,获取 AI 驱动的见解,了解导致其当前状态的内容。 例如,以下程序在其循环条件中出现逐个错误:
如果单击变量的导致此问题的代码是:for(auto it = h.animals_.begin(); 它<= h.animals_.end(); it++。
it
“询问 Copilot”图标,它将告诉你它<NULL>
的原因:此错误位于定义为 int calculate_number_of_cats(const house& h)的函数内。 GitHub Copilot 消息说:“表达式的值为 NULL,这意味着迭代器不指向向量中的任何有效元素animals_。 在程序的上下文中,它应该循环访问房屋对象中的animals_向量来计算猫对象的数量。 为何为 null。 基于局部变量和调用堆栈上下文:house 对象 h 具有空animals_向量(size=0)。 <= h.animals_.end() 的循环条件不正确。 它应该是 != h.animals_.end()。”
- 可以单击“ 向 Copilot 询问 Visual Studio 错误列表中的 错误”以获取有关错误和建议的修复的帮助。 例如:
如果单击“询问 Copilot”,它会告诉你有关错误的信息:“Ask Copilot”图标突出显示unique_ptr尝试引用已删除函数的错误旁边。
Copilot 消息说:“发生错误的原因是基于范围的 for 循环尝试复制 std::unique_ptr 对象,因为无法复制 std::unique_ptr。 若要解决此问题,我更改了循环以使用引用来避免复制 std::unique_ptr 对象。 这样,循环访问对 std::unique_ptr 对象的引用,这是允许的。
- 调试
- 新的调试可视化工具,
mutex
recursive_mutex
以及move_iterator
。 - 调试器现在以内联形式显示返回值:
- 新的调试可视化工具,
Visual Studio 版本 17.11 中C++的新增功能
发布日期:2024 年 8 月
有关 | 请参阅 |
---|---|
面向 C++ 开发人员的新增功能 | Visual Studio 2022 17.11 中面向C++开发人员的新增功能 |
标准库 (STL) 合并了 C++26 和 C++23 功能、C++20 缺陷报告、LWG 问题解决方法、性能改进、增强的行为和修复的 bug | STL Changelog 17.11 |
Visual Studio 17.11 IDE 中的新功能 | Visual Studio 2022 版本 17.11 发行说明 |
Visual Studio 2022 17.11 中的C++语言一致性改进 | C++ Visual Studio 2022 17.11 中的一致性改进、行为更改和 bug 修复 |
新功能的部分列表:
标准库增强功能
- 格式化的输出实现现在包括
std::range_formatter
和格式化程序以及格式化std::pair
std::tuple
程序。 - 添加了对
std::println()
无参数的支持。 这将打印P3142R0中建议的空白行。 - 改进了多个算法的向量化,包括
replace_copy()
、ranges::replace_copy
replace_copy_if()
、ranges::replace_copy_if
find_first_of()
和ranges::find_first_of
8 位和 16 位元素、mismatch()
、ranges::mismatch
、count()
ranges::count
、find()
、、ranges::find
、和。ranges::find_last
ranges::iota
- 格式化的输出实现现在包括
C++中的游戏开发
- 现在可以从 Visual Studio 中添加常见的 Unreal Engine 类模板、模块和插件。 有关详细信息,请参阅 在 Visual Studio 中添加 Unreal Engine 类、模块和插件。
- 新的 Unreal Engine 工具栏提供从 Visual Studio 中快速访问 Unreal Engine 相关操作。 工具栏允许你快速附加到 Unreal Engine 进程、重新扫描蓝图缓存、快速访问 Unreal Engine 日志,并提供对 Visual Studio 的 Unreal Engine 配置页的快速访问。 有关详细信息,请参阅 Unreal Engine 工具栏。
- 现在可以按项目筛选跟踪结果。 此外,每行的结果显示相对路径和文件名,而不是完整路径。 “包含的文件”视图中的结果分组也得到了改进:
“包含的文件”视图具有项目的新列。 已选择“项目”列,并且选择了“全选”、“CompilerIdC”、“OpenAL”、“常用”等项目。 包含的文件按相对路径和文件名列出,并分组在一起。
CMake 调试
- 现在可以通过 适用于 Linux 的 Windows 子系统 (WSL) 或 SSH 调试面向 Linux 的 CMake 项目的 Visual Studio 调试器中的 CMake 脚本和
CMakeLists.txt
文件。 若要在 Visual Studio 中启动 CMake 调试会话,请在CMakeLists.txt
文件中设置断点,然后导航到 Project>Configure Cache with CMake Debugging。
- 现在可以通过 适用于 Linux 的 Windows 子系统 (WSL) 或 SSH 调试面向 Linux 的 CMake 项目的 Visual Studio 调试器中的 CMake 脚本和
GitHub Copilot
- 将鼠标悬停在代码编辑器中的符号上时,单击“快速信息”对话框中的“Copilot 告诉我 更多”按钮,了解有关给定符号的详细信息:
“快速信息”窗口显示在函数上方。 突出显示了“告诉我更多”链接。
- GitHub Copilot 可以根据标识符的使用方式和代码样式,为标识符(变量、方法或类)生成命名建议。
“重命名”对话框具有一个“新建名称”字段,其中包含显示这些选项的下拉列表:text_color、font_color、display_color、console_color和menu_text_color。
需要有效的 GitHub Copilot 订阅。 右键单击要重命名的变量,然后选择“重命名”(
Ctrl+R
,)。Ctrl+R
选择 GitHub Copilot sparkle 图标以生成命名建议。调试
- C++中的条件断点速度更快。
诊断改进
- 改进了调用
std::get<T>
std::tuple
其模板参数中包含多个实例的T
诊断。 用于报告的 MSVC:
error C2338: static_assert failed: 'duplicate type T in get<T>(tuple)'
。
现在它报告:
error C2338: static_assert failed: 'get<T>(tuple<Types...>&) requires T to occur exactly once in Types.(N4971 [tuple.elemm]/5)'
- 改进了无法构造请求的结果时的诊断
std::ranges::to
。 用于报告的 MSVC:
error C2338: static_assert failed: 'the program is ill-formed per N4950 [range.utility.conv.to]/2.3'
现在它报告:
error C2338: static_assert failed: 'ranges::to requires the result to be constructible from the source range, either by using a suitable constructor, or by inserting each element of the range into the default-constructed object. (N4981 [range.utility.conv.to]/2.1.5)'
- 改进了调用
Visual Studio 版本 17.10 中 C++ 的新增功能
发布日期:2024 年 5 月
有关 | 请参阅 |
---|---|
面向 C++ 开发人员的新增功能 | Visual Studio 2022 17.10 中面向C++开发人员的新增功能 |
标准库 (STL) 合并了 C++26 和 C++23 功能、C++20 缺陷报告、LWG 问题解决方法、性能改进、增强的行为和修复的 bug | STL 更改日志 17.10 |
Visual Studio 17.10 IDE 中的新增功能 | Visual Studio 2022 版本 17.10 发行说明 |
Visual Studio 2022 17.10 中的 C++ 语言一致性改进 | Visual Studio 2022 17.10 中的 C++ 符合性改进、行为更改和 bug 修复 |
新功能的部分列表:
- MSVC 工具集更新:MSVC 工具集版本已从 19.39 更新到 19.40。 这可能会影响具有版本假设的项目。 有关影响项目(假定 MSVC 版本均为 Visual Studio 2022 版本的 19.3X)的某些方式的详细信息,请参阅 VS 2022 v17.10 中的 MSVC 工具集次要版本号 14.40。
- 标准库增强功能:标准库添加了对 P2510R3格式设置指针的支持,这为指针带来了一组格式说明符,这些
std::format
说明符与已存在的整数格式说明符一起使用。 改进了std::min_element
、std::ranges::min
和友元的矢量化实现。 - Build Insights:现在会提供模板实例化信息。 请参阅 Visual Studio 中 Build Insights 的模板视图或纯虚拟 C++ - Visual Studio 中 Build Insights 的模板视图录像。
- Unreal Engine 插件:Unreal Engine 插件有一个新的选择加入功能,该功能在后台运行,可以降低启动成本。 这是一项选择加入功能,可通过“工具”>“选项”>“Unreal Engine”来激活。
- 适用于 Linux 的新功能:请参阅 Visual Studio 中新增的 Linux 开发功能。
- CMake 目标:现在可以在“CMake 目标视图”中固定目标。
- 连接管理器用户体验:在连接到远程系统时,用户体验提供更顺畅的体验。 有关详细信息,请参阅 Visual Studio 连接管理器中的可用性改进。
- 拉取请求注释:现在可以直接在工作文件中查看 GitHub 和 Azure DevOps 注释。 在“选项”>“环境”>“预览版功能”中启用功能标志“拉取请求注释”,并签出拉取请求分支以开始使用。
- AI 生成的内容:GitHub Copilot 现在可以起草拉取请求说明。 需要一个活动的 GitHub Copilot 订阅。 通过单击“创建拉取请求”窗口中的“添加 AI 生成的拉取请求描述”闪光笔图标来试用。
- 图像预览:将鼠标悬停在图像路径上以查看包含大小详细信息的预览。 大小上限为 500 像素宽和高。
鼠标悬停在行 std::filesystem::path vs_logo_path = "../images/vs_logo.png" 上。 下面显示了 Visual Studio 徽标的预览,以及其大小为 251 x 500 像素和 13.65 KB 的信息。
- 断点/跟踪点创建:现在,你可以从右键单击菜单直接从源代码中的表达式创建条件断点或跟踪点。 这适用于自动、局部变量、监视窗口或数据提示中的属性或字段名称和值。
- “附加到进程”对话框:“附加到进程”对话框提供的功能对用户更加友好。 现在可轻松地在树视图和列表视图之间切换,使用可折叠部分更好地组织流程,并使用简化的组合框选择代码类型。 此外,“选择/跟踪窗口”功能现在更易于使用,支持双向跟踪,选择进程会突出显示其窗口,而单击窗口可选择其进程。
- GitHub Copilot 集成:GitHub Copilot 和 Copilot Chat 扩展现已统一,现在直接在 Visual Studio 中交付。 若要安装它,请在 Visual Studio 安装程序 中安装 GitHub Copilot组件:
GitHub Copilot 界面位于 Visual Studio 的右上角。 若要使用它,你需要一个活动的 GitHub Copilot 订阅。
GitHub Copilot 按钮显示在 Visual Studio 的右上角。 它具有打开聊天窗口、进行 GitHub Copilot 设置、了解详细信息和管理 Copilot 订阅的选项。
Visual Studio 版本 17.9 中 C++ 的新增功能
发布日期:2024 年 2 月
有关 | 请参阅 |
---|---|
面向 C++ 开发人员的新增功能 | Visual Studio 2022 17.9 中面向C++开发人员的新增功能 |
标准库 (STL) 合并了 C++23 功能、性能改进,增强的行为、LWG 问题解决方法和修复的 bug | STL 更改日志 17.9 |
Visual Studio 17.9 IDE 中的新增功能 | Visual Studio 2022 版本 17.9 发行说明 |
Visual Studio 2022 17.9 中的 C++ 语言一致性改进 | Visual Studio 2022 中的 C++ 符合性改进、行为更改和 bug 修复 |
C++ 后端更新摘要 | 自 Visual Studio 2022 版本 17.3 以来的 MSVC 后端更新 |
新功能的部分列表:
#include
诊断,它提供对#include
指令的详细分析。 通过右键单击#include
并选择“#include 指令”>“启用 #include 指令诊断”来激活此功能。 在每个#include
上方会显示你的代码引用该#include
文件的次数。 单击引用链接可导航到你的代码中使用该头文件中内容的位置。 若要查看#include
指令的生成时间,请通过导航到“生成”>“对解决方案运行 Build Insights”>“生成”来运行 Build Insights。在 #include 上方是一个“引用”链接和对此 #include 文件的许多引用(在本例中为 1)。 还会列出生成时间(在本例中小于 1/2 秒)。
- 内存布局可视化效果,这会显示为你的类、结构和联合安排的内存情况。 将鼠标指针悬停在某个类型上并选择“快速信息”中的“内存布局”链接可以打开一个专用窗口,其中会显示所选类型的内存布局。 将鼠标指针悬停在此窗口中的各个数据类型上会提供有关其大小和偏移量的详细信息。
内存布局窗口显示了 Snake 类的内容。 它显示类的各个字段的内存偏移量,例如,表示头部和身体的位置的 Point 类、分数,等等。
- 你现在可以指定自己的自定义 CMake 可执行文件。 如果你要使用 Visual Studio 中未附带的特定 CMake 版本,则此功能非常有用。 导航到“工具”>“选项”,然后选择“CMake”>“常规”。 选择“启用自定义 CMake 可执行文件”并指定你的 CMake 可执行文件的目录路径。
CMake 选项对话框,其中突出显示了“启用自定义 CMake 可执行文件”选项和“CMake 可执行文件目录”字段。
- 改进了 Unreal Engine 项目的 IntelliSense
- 改进了 C++23 支持:根据 P0009R18 改进了作为 P2286R8 格式设置范围
<mdspan>
的一部分的std::format
、std::span
formattable
、range_format
、format_kind
和set_debug_format()
,以及应用于 C++23 标准的后续措辞更改。 另外,format()
可以根据 P2510R3 设置指针格式。
Visual Studio 版本 17.8 中 C++ 的新增功能
发布时间:2023 年 11 月
有关 | 请参阅 |
---|---|
面向 C++ 开发人员的新增功能 | Visual Studio 2022 17.8 中面向C++开发人员的新增功能 |
标准库 (STL) 合并了 C++26、C++23 功能、C++20 扩展、LWG 问题解决方法、性能改进、增强的行为和修复的 bug | STL 更改日志 17.8 |
Visual Studio 17.8 IDE 中的新增功能 | Visual Studio 2022 版本 17.8 发行说明 |
Visual Studio 2022 17.8 中的 C++ 语言一致性改进 | Visual Studio 2022 中的 C++ 符合性改进、行为更改和 bug 修复 |
2023 年 Visual Studio、VS Code 和 vcpkg 中的 C++ 改进概述 | C++ 改进的一年 |
新功能的部分列表:
- “输出”窗口中的 C++ 结构化诊断,以及一个新的问题详细信息窗口,该窗口提供有关错误的详细信息。 有关详细信息,请参阅《结构化 SARIF 输出》和《问题详细信息窗口》。
- 一项功能,可让你在编译代码之前可视化类、结构、联合、基类型或枚举的大小和对齐方式。 将鼠标悬停在标识符上,“快速信息”将显示大小和对齐信息。
- 一项功能,建议何时标记成员函数
const
,因为它们不会修改对象的状态。 将鼠标悬停在成员函数上,然后单击灯泡图标将函数标记为const
。 - Visual Studio 现在提示你通过函数名称旁边显示的螺丝刀图标将全局函数标记为静态。 单击螺丝刀图标将函数标记为静态。
- 未使用的 #include 指令在编辑器中灰显。 可以将鼠标悬停在灰显的 include 上,并使用灯泡菜单删除该 include 或所有未使用的 include。 你还可以为通过其他标头间接包含的实体添加
#include
指令。 有关详细信息,请参阅《在 Visual Studio 中清除 C/C++ Include》。 - 更多 Unreal Engine 支持:
- Unreal Engine 测试适配器允许你发现、运行、管理和调试 Unreal Engine 测试,而无需离开 Visual Studio IDE。
- 使用 Unreal Engine 代码片段,可以在成员列表中找到作为代码片段的常见的 Unreal Engine 构造。
- Build Insights 现已与 Visual Studio 2022 集成,并使用 MSVC 处理 MSBuild 和 CMake 项目。 你现在可以查看有关函数编译的其他信息,例如编译所花费的时间和 ForceInline 的数量,以及头文件对生成时间的影响。 有关详细信息,请参阅教程:排查影响生成时间的函数内联和教程:排查头文件对生成时间的影响。
- 远程 Linux 单元测试支持现在允许从 Visual Studio 的测试资源管理器在远程 Linux 计算机上运行 CTest 和 GTest 测试,就像本地测试一样。
Visual Studio 版本 17.7 中的 C++ 新增功能
发布时间:2023 年 8 月
有关 | 请参阅 |
---|---|
面向 C++ 开发人员的新增功能 | Visual Studio 2022 17.7 中面向C++开发人员的新增功能 |
特定于游戏开发的新增 C++ 功能 | 释放 Visual Studio 2022 进行 C++ 游戏开发的能力 |
标准库 (STL) 合并了 C++23 功能、LWG 问题解决方法、性能改进、增强的行为和修复的 bug | STL 更改日志 17.7 |
Visual Studio 17.7 IDE 中的新增功能 | Visual Studio 2022 版本 17.7 发行说明 |
Visual Studio 2022 17.7 中的 C++ 语言一致性改进 | Visual Studio 2022 中的 C++ 符合性改进、行为更改和 bug 修复 |
新功能的部分列表:
- 更快的调试会话和更快的项目加载速度
- 宏扩展的分步可视化
- 适用于 Linux 的 Windows 子系统 (WSL) 的一键式下载
- 改进了对 Doxygen 注释的支持
- 用于游戏开发的 C++ 生成见解
- 已为 C 编译器添加
/std:clatest
。 - Unreal Engine 项目改进,例如更快的 IntelliSense 和语法着色、查找所有 Unreal Engine 蓝图引用的功能等。
Visual Studio 版本 17.6 中的 C++ 新增功能
发布日期:2023 年 5 月
有关 | 请参阅 |
---|---|
面向 C++ 开发人员的新增功能 | Visual Studio 2022 17.6 中面向 C++ 开发人员的新增功能 |
标准库 (STL) 合并了 C++23 功能、LWG 问题解决方法、性能改进、增强的行为和修复的 bug | STL 更改日志 17.6 |
Visual Studio 17.6 IDE 中的新增功能 | Visual Studio 2022 版本 17.6 发行说明 |
Visual Studio 2022 17.6 中的 C++ 语言一致性改进 | Visual Studio 2022 中的 C++ 符合性改进、行为更改和 bug 修复 |
新功能的部分列表包括:
- CMake 脚本调试
- 对 High Level Shading Language (HLSL) 的内置支持
- Unreal Engine 日志查看器
- 现在会默认添加 VCPKG
- C++/CLI 项目中对 C++20 的初始支持,以及适用于范围的一些 C++23 标准库功能。
Visual Studio 版本 17.5 中 C++ 的新增功能
发布日期:2023 年 2 月
有关 | 请参阅 |
---|---|
面向 C++ 开发人员的新增功能 | Visual Studio 2022 17.5 中面向 C++ 开发人员的新增功能 |
标准库 (STL) 合并了 C++23 功能、LWG 问题解决方法、性能改进、增强的行为和修复的 bug | STL 更改日志 17.5 |
Visual Studio 17.5 IDE 中的新增功能 | Visual Studio 2022 版本 17.5 发行说明 |
新功能的部分列表包括:
std::move
、std::forward
、std::move_if_noexcept
和std::forward_like
现在不会在生成的代码中生成函数调用,即使在调试模式下也是如此。 此更改可避免命名强制转换在调试版本中导致不必要的开销。/permissive-
(或表示它的选项,例如/std:c++20
或std:c++latest
)是必需的。已添加
[[msvc::intrinsic]]
。 你可以将此属性应用于由单个强制转换组成的非递归函数,该函数仅采用一个参数。在允许终端 I/O 的集成终端中添加了对 Linux 控制台的支持。
添加了对 C11 原子基元 (
<stdatomic.h>
) 的初始实验性支持。 可在/std:c11
模式或更高版本中使用/experimental:c11atomics
选项来启用此实验性功能。向生存期检查器添加了一组新的实验性高置信度检查,以减少干扰。
一个新的预览功能“远程文件资源管理器”,可让你在 VS 中查看远程计算机上的文件目录,并可在其中上传和下载文件。
更改了 Visual Studio 随附的 CMake 可执行文件的版本控制,以与 Kitware 版本匹配。
向 CMake 项目模板添加了对热重载的支持。
C++ 的“转到定义”现在使用更精细的指示器,表明操作需要更多的时间,取代了以前版本中的模式对话框。
已开始推出一项试验,在 C++ 自动完成和成员列表中提供更多智能结果。 此功能以前称为“预测 IntelliSense”,但现在使用一种新的表示方法。
我们现在提供带 LLVM 工作负载的本机 Arm64 Clang 工具集,允许在 Arm64 计算机上进行本机编译。
添加了图像查看扩展的本地化(此扩展在市场中提供,并且未通过 Visual Studio 安装程序捆绑)。
添加了在当前运行的开发人员容器中打开终端窗口的支持。
对 IntelliSense 宏扩展进行了多项改进。 值得注意的是,我们在更多上下文中启用了递归扩展,并在弹出窗口中添加了将扩展复制到剪贴板或内联扩展宏的选项。
串行监视器现在支持并发监视。 并发监视允许同时并排监视多个端口。 按加号按钮可打开另一个串行监视器并开始使用。
现在可以查看在 Unreal Blueprint 资产中修改的基类的属性,而无需退出 Visual Studio。 双击 C++ 类或属性的蓝图引用,在 Visual Studio 中打开 UE 资产检查器。
在远程 Linux 计算机上启用了运行中的 DevContainers。
在 CMake 目标视图中选择了要构建的多个目标。
添加了对 CMakePresets.json 版本 5 的支持。 有关新功能的信息,请参阅 CMake 文档。
启用了测试资源管理器以并行生成和测试多个 CMake 目标。
在开发容器中添加了“在终端中打开容器”选项。
实现了标准库功能:
Visual Studio 版本 17.4 中 C++ 的新增功能
发布时间:2022 年 11 月
有关 | 请参阅 |
---|---|
面向 C++ 开发人员的新增功能 | Visual Studio 2022 17.4 中面向 C++ 开发人员的新增功能 |
标准库 (STL) 合并了 C++23 功能、LWG 问题解决方法、性能改进、增强的行为和修复的 bug | STL 更改日志 17.4 |
Visual Studio 17.4 IDE 中的新增功能 | Visual Studio 2022 版本 17.4 发行说明 |
Visual Studio 2022 17.4 中的 C++ 语言一致性改进 | Visual Studio 2022 中的 C++ 符合性改进、行为更改和 bug 修复 |
17.4 中新功能的部分列表:
改进了编译器错误消息,以提供更正确和有用的信息,尤其是对于概念。
添加了实验性 MSVC 选项
/experimental:log<directory>
,将结构化 SARIF 诊断输出到指定目录。向 IntelliSense 添加了对 C23 属性的支持,并在 C++20 模块支持中继续取得进展。
改进了打开新解决方案时的编制索引性能。 大型项目可以在 17.3 的基础上提高 20-35%。
改进了命名返回值优化 (NRVO):
- NRVO 针对涉及异常处理或循环的情况启用。
- 如果用户传递
/Zc:nrvo
选项、/std:c++20
或更高版本或/permissive-
,则即使在/Od
下也启用 NRVO。 - 现在可以使用
/Zc:nrvo-
选项禁用 NRVO。
已将 Visual Studio 随附的 LLVM 版本升级到 15.0.1。 有关可用功能的详细信息,请参阅 LLVM 和 Clang 发行说明。
已使用 CMake 项目为 Visual Studio 添加了对 vcpkg 项目的支持。 对于包含 vcpkg 清单的项目,会在项目打开时自动激活环境。 在 Visual Studio 博客文章中的 vcpkg 环境激活中了解有关此功能的详细信息。
现在,可以将开发容器用于 C++ 项目。 在 适用于 C++ 的开发容器博客文章中了解有关此功能的详细信息。
当预先包含标头中有一个为 PCH 时,IntelliSense 现在遵循预先包含标头的顺序。 以前,当通过
/Yu
使用 PCH 并通过/FI
强制包含它时,IntelliSense 将始终先处理它,然后再处理通过/FI
包含任何其他标头。 此行为与生成行为不匹配。 进行此更改后,/FI
标头将按照指定的顺序进行处理。从测试资源管理器中的 CTest 名称中删除了内部前缀。
将 Visual Studio 随附的 CMake 版本升级到了版本 3.24.1。 有关可用功能的详细信息,请参阅 CMake 发行说明。
Android SDK 更新:
- Ant 脚本已删除,因此用户不会再在“新建项目”对话框中看到基于 Ant 的模板。 有关从 Ant 模板迁移到 Gradle 模板的帮助,请参阅从 Apache Ant 迁移生成
- 添加了对使用 NDK 23 和 24 生成的支持
- 已将 NDK 组件更新到 LTS 版本 23
添加了
ranges::min_element()
、ranges::max_element()
和ranges::minmax_element()
的矢量化实现我们将继续跟踪 C++ 标准化的最新发展。 可通过在编译器选项中包括
/std:c++latest
来提供对这些 C++23 功能的支持:P2302R4
ranges::contains
、ranges::contains_subrange
P2499R0
string_view
范围构造函数应为explicit
P0849R8
auto(x)
:语言中的衰减复制(编译器部件尚未实现。最初实现范围支持时,库部件是在 C++20 模式下实现的。)
P0881R7
<stacktrace>
P2301R1 添加
std::stacktrace
的pmr
别名P1328R1
constexpr type_info::operator==()
P2440R1
ranges::iota
、ranges::shift_left
、ranges::shift_right
P2441R2
views::join_with
添加了“创建声明/定义后导航”选项,允许你选择“创建声明/定义”功能的导航行为。 可以在速览(默认)或打开文档或无导航之间进行选择。
Visual Studio 的 Arm64 版本现在绑定了 CMake 和 Ninja 的 Arm64 版本。
添加了对 CMake 预设版本 4 的支持。 有关可用功能的详细信息,请参阅 CMake 发行说明。
使用连接管理器的远程系统连接现在支持 SSH ProxyJump。 ProxyJump 用于通过另一个 SSH 主机访问 SSH 主机(例如,访问防火墙后面的主机)。
Visual Studio 版本 17.3 中 C++ 的新增功能
发布时间:2022 年 8 月
有关 | 请参阅 |
---|---|
面向 C++ 开发人员的新增功能 | 17.3 中的 C++ 改进 |
标准库 (STL) 合并了 C++23 功能、LWG 问题解决方法、性能改进、增强的行为和修复的 bug | STL 更改日志 17.3 |
Visual Studio 17.3 IDE 中的新增功能 | Visual Studio 2022 版本 17.3 发行说明 |
Visual Studio 2022 17.3 中的 C++ 语言一致性改进 | Visual Studio 2022 中的 C++ 符合性改进、行为更改和 bug 修复 |
17.3 中新功能的部分列表:
- Arm64EC 工具链不再标记为实验性,已可供生产使用。
- Visual Studio 终端现在可作为 SSH 客户端与存储的 SSH 连接一起使用。 安装适用于 Linux 工具的 C++ 后,打开终端工具窗口。 终端下拉列表将填充存储的连接。 选择连接时,将在 Visual Studio 中打开一个新的终端窗口,其中显示远程系统上的伪终端。 控制字符、颜色和光标位置感知都受支持。
- Visual Studio 现在可以为 UE 项目添加 Unreal Engine 类模板。 若要试用此功能,请确保 Visual Studio 安装程序中的“使用 C++ 的游戏开发”工作负载中选择了“针对 Unreal Engine 的 IDE 支持”。 处理 UE 项目时,右键单击项目或文件夹/筛选器,然后选择“添加”>“UE 类”。
- 现在,“转到定义”将记住以前的签名,并在没有更好的匹配项(例如,手动更改其中一对签名)时进行相应导航。 提高了“转到全部”的响应速度。 以前,结果要在停止键入后才会显示。 在新体验中,键入时就会显示结果。
- 在需要
enum
类型完成(例如enum
变量、case 标签、返回enum
类型等的赋值)的上下文中,自动完成列表现在仅筛选匹配的枚举器和相关构造。 - 为面向 .NET Core 的 C++/CLI MSBuild 项目添加了 NuGet PackageReference 支持。 进行此更改是为了解决混合代码库无法采用 .NET Core 的障碍。 此支持不适用于其他 C++ 项目类型或任何面向.NET Framework 的 C++ 项目类型。 目前没有计划将 PackageReference 支持扩展到其他 C++ 方案。 团队正在为非 MSBuild 方案开发涉及 vcpkg 的单独体验,并添加更强大的功能。
- 为嵌入式开发添加了串行监视器窗口,可通过“调试”>“Windows”>“串行监视器”找到。
- 与 17.2 相比,C++ 索引提高了约 66%。
- 将 Visual Studio 随附的 CMake 版本升级到了版本 3.23。 有关可用内容的详细信息,请参阅 CMake 3.23 发行说明。
- 将 Visual Studio 随附的 LLVM 工具版本升级到了 v14。 有关可用内容的详细信息,请参阅 LLVM 和 Clang 发行说明。
- 将并行 Dev 16.11 C++ 工具集更新到了版本 14.29.30145.00。 最新版本的 Dev 16.11 C++ 工具集包含重要的 bug 修复,包括修复所有剩余的 C++20 缺陷报告。 有关 bug 修复的详细信息(包括 Dev 16.11 中的 C++20 缺陷报告),请参阅 Visual Studio 2019 版本 16.11.14 发行说明。
- 我们对 C++ 模块的编辑器内体验进行了各种改进。 我们正在不断努力提高体验的质量,鼓励你试用 17.3。 通过开发者社区报告存在的问题。
Visual Studio 版本 17.2 中 C++ 的新增功能
发布日期:2022 年 5 月
有关 | 请参阅 |
---|---|
面向 C++ 开发人员的新增功能 | Visual Studio 2022 17.2 现已推出 |
标准库 (STL) 合并了 C++20 缺陷报告、C++23 功能、LWG 问题解决方法、性能改进、增强的行为和修复的 bug | STL 更改日志 17.2 |
Visual Studio 17.2 IDE 中的新增功能 | Visual Studio 2022 版本 17.2 发行说明 |
Visual Studio 2022 17.2 中的 C++ 语言一致性改进 | Visual Studio 2022 中的 C++ 符合性改进、行为更改和 bug 修复 |
17.2 中新功能的部分列表:
- 添加了对 C++23 功能 deducing
this
的编译器支持(可在/std:c++latest
选项下使用)。 - 添加了对 C++23 功能 deducing
this
和if consteval
的 IntelliSense 支持。 - 添加了内联参数名称和类型提示支持(通过按 Alt+F1 或双击 Ctrl 进行切换)。 可以在“工具”>“选项”>“文本编辑器”>“C/C++”>“IntelliSense”下自定义此行为。
- 在 CMake 项目中添加了对 C++20 模块的实验性支持。 此支持目前仅适用于 Visual Studio (MSBuild) 生成器。
- 在 17.1 中,我们为嵌入式开发人员引入了外围寄存器和 RTOS 视图。 我们会在 17.2 中提高可用性,从而继续改进这些视图的功能:
- RTOS 工具窗口现在默认处于隐藏状态。 未使用 RTOS 时,它可以阻止显示带有不相关错误消息的工具窗口。
- 在工具窗口中双击 RTOS 对象时,它会为该对象添加监视。
- 在 RTOS 工具窗口中选择堆栈指针的开始值和结束值时,它会在内存窗口中打开。
- 我们已将设备目标的线程感知添加到调用堆栈窗口。
- 用户现在可以选择外围设备、寄存器或字段旁边的固定图标,将它们固定到外围设备视图的顶部。
- 我们添加了其余 C++20 缺陷报告(也称为“后移植”)的实现。 所有 C++20 功能现已在
/std:c++20
选项下提供。 有关实现的后移植的详细信息,请参阅 Microsoft/STL GitHub 存储库中的 C++20 缺陷报告项目以及 MSVC 的 STL 完成/std:c++20
博客文章。 - 我们添加了各种 C++23 库功能,位于
/std:c++latest
选项下。 有关新功能的详细信息,请参阅 STL 存储库更改日志。 - 根据包含图的深度,将初始 C++ 索引的性能提高了 20%。
Visual Studio 版本 17.1 中 C++ 的新增功能
发布日期:2022 年 2 月
有关 | 请参阅 |
---|---|
面向 C++ 开发人员的新增功能 | Visual Studio 2022 17.1 现已推出! |
标准库 (STL) 合并了 C++23 功能、LWG 问题解决方法、性能改进、增强的行为和修复的 bug | STL 更改日志 17.1 |
Visual Studio 17.1 IDE 中的新增功能 | Visual Studio 2022 版本 17.1 发行说明 |
Visual Studio 2022 17.1 中的 C++ 语言一致性改进 | Visual Studio 2022 中的 C++ 符合性改进、行为更改和 bug 修复 |
17.1 中新功能的部分列表:
- 添加了新的“配置预设”模板,以使用
CMakePresets.json
在远程 macOS 系统上配置和生成 CMake 项目。 此外,还可以在远程 macOS 系统上启动 CMake 目标,然后使用由 GDB 或 LLDB 提供支持的 Visual Studio 调试程序进行远程调试。 - 现在,可以使用 LLDB 或 GDB 在 Visual Studio 中调试远程 macOS 系统上的核心转储。
- Visual Studio 附带的版本
Clang
和LLVM
升级到 v13。 - Visual Studio 的 CMake 集成仅当在开放工作区根目录中识别到
CMakeLists.txt
时激活。 如果在该工作区的其他级别识别到CMakeLists.txt
,则系统会通过发出一条通知来提示你激活 Visual Studio 的 CMake 集成。 - 可用于检查微控制器上的外围寄存器以及实时操作系统 (RTOS) 对象并与之交互的新视图(可通过依次选择“调试”>“Windows”>“嵌入式寄存器”找到这些视图)
- 为 RTOS 项目添加了一个新的线程视图,可通过“调试”>“窗口”>“RTOS 对象”访问该视图。 有关详细信息,请参阅 Visual Studio 中的嵌入式软件开发。
Visual Studio 版本 17.0 中 C++ 的新增功能
发布时间:2021 年 11 月
有关 | 请参阅 |
---|---|
Visual Studio 17.0 IDE 中的新增功能 | Visual Studio 2022 版本 17.0 发行说明 |
标准库 (STL) 合并C++23 和 C++26 功能,C++20 缺陷报告、LWG 问题解决方法、性能改进、增强行为和修复 bug | STL 更改日志 17.0 |
Visual Studio 2022 17.0 中的 C++ 语言一致性改进 | Visual Studio 2022 17.10 中的 C++ 符合性改进、行为更改和 bug 修复 |
Visual Studio 2022 版本 17.0 中的一些新增功能概述:
- Visual Studio IDE
devenv.exe
现在是本机 64 位应用程序。 - MSVC 工具集现在默认为调试记录中的 SHA-256 源哈希。 以前,工具集默认使用 MD5 进行源哈希处理。
- v143 生成工具现可通过 Visual Studio 安装程序使用,也可在独立的生成工具中使用。
本机 C++ 的热重载
- 借助 C++ 的热重载,可对正在运行的应用进行多种类型的代码编辑,并且无需使用断点等暂停应用执行就可应用这些更改。
在 Visual Studio 2022 中,当你在调试器中启动应用程序时,可以使用“热重载”按钮在应用程序仍在运行时对其进行修改。 此体验由本机“编辑并继续”提供支持。 有关受支持编辑的详细信息,请参阅编辑并继续 (C++)。
- 热重载支持 CMake 和 Open Folder 项目。
WSL2 支持
- 现在无需建立 SSH 连接即可在 WSL2 上进行本机生成和调试。 跨平台的 CMake 项目和基于 MSBuild 的 Linux 项目均受支持。
经过改进的 CMake 支持
我们将 Visual Studio 附带的 CMake 版本升级到了版本 3.21。 若要详细了解此版本提供的功能,请参阅 CMake 3.21 发行说明。
已更新 CMake 概述页面,现支持
CMakePresets.json
。现可使用 CMake 3.21 和
CMakePresets.json
v3 配置和生成 CMake 项目。Visual Studio 现在支持在
CMakePresets.json
中使用buildPresets.targets
选项。 此选项使你能够在 CMake 项目中生成目标的子集。CMake 项目中的“项目”菜单已经过简化,显示“删除缓存并重新配置”和“查看缓存”选项。
实施了
/scanDependencies
编译器选项以列出 CMake 项目的 C++20 模块依赖项,如 P1689R5 中所述。 这步举措旨在支持使用 CMake 生成基于模块的项目,我们正努力在更高版本中完成此支持。
标准库改进
此处突出显示了选择标准库 (STL) 改进。 有关新功能、更改、bug 修复和性能改进的完整列表,请参阅 STL 团队的 Changelog。
- 添加了调试可视化工具以改善以下类型的显示方式:
source_location
、bind_front()
、u8string
(及其迭代器)、default_sentinel_t
、unreachable_sentinel_t
、ranges::empty_view
、ranges::single_view
、ranges::iota_view
(及其迭代器/sentinel)、ranges::ref_view
、thread
、thread::id
、jthread
和filesystem::path
- 在
<string>
中的stoi()
系列函数和<locale>
中的各种函数(如collate
成员函数)、has_facet()
以及isalnum()
和tolower()
系列函数中添加了[[nodiscard]]
。 - P0980R1 将
std::string
constexpr
合并到 VS 2019 16.10。 现在支持 Clang。 - P1004R2 将
std::vector
constexpr
合并到 VS 2019 16.10。 现在支持 Clang。
突出显示了 C++23 功能
- P1048R1 添加了
is_scoped_enum
,这是 C++ 标准库的一个新特性,可以检测某个类型是否为区分范围的枚举。 - P1132R7
out_ptr()
、inout_ptr()
- P1679R3
contains()
适用于basic_string
和basic_string_view
- P1682R3
to_underlying()
适用于枚举 - P2162R2 允许继承自
std::variant
- P2166R1 禁止从
nullptr
构造basic_string
和basic_string_view
。 这是一项源中断性变更。 以前在运行时具有未定义行为的代码现在会被拒绝并出现编译器错误。 - P2186R2 已删除垃圾回收支持。 此更改将删除
declare_reachable
、undeclare_reachable
、declare_no_pointers
、undeclare_no_pointers
和get_pointer_safety
。 以前,这些函数不起作用。
突出显示了性能改进
<format>
现在可以检测到它何时写入到basic_string
或vector
的back_insert_iterator
中,并在容器的end()
处对insert()
进行更快的调用。- 将
vector<bool>
的std::find()
和std::count()
的性能提高了 19 倍和 26 倍(注意是倍数,不是百分数)。 - 提高了
vector<bool>
的std::count()
的性能 std::byte
现在的性能与reverse()
和variant::swap()
中unsigned char
的性能相同
Clang 和 LLVM 支持
Visual Studio 附带的 LLVM 工具已升级到 LLVM 12。 有关详细信息,请参阅 LLVM 发行说明。
Clang-cl 支持已更新到 LLVM 12。
现可使用 LLDB 从 Visual Studio 调试在远程系统上运行的进程。
C++ AMP 已弃用
- C++ AMP 标头现已弃用。 在 C++ 项目中添加
<amp.h>
会导致出现生成错误。 若要禁止提示错误,请定义_SILENCE_AMP_DEPRECATION_WARNINGS
。 有关详细信息,请参阅 AMP 弃用链接。
IntelliSense 改进
- 改进了 C++ IntelliSense,为导入的模块和标头单元中的类型提供了导航和语法突出显示功能。 IntelliSense 是我们积极投入的一个方面。 请帮助我们改进:在开发者社区通过“帮助”>“发送反馈”来分享你的反馈 。
- 通过优化缓存标头使用情况和对符号数据库的访问,以及通过提升进入代码的访问速度,改进了 C++ IntelliSense 的性能。
- IntelliSense Code Linter for C++ 现在默认为启用状态,提供对常见代码缺陷的即时建议和修复建议。
- 现在,在使用带有显示名称的预设时,可使用 C++ IntelliSense for CMake 项目。
C++ 工作负载更新
- 已更新到 C++ 移动开发工作负载中的 NDK r21 LTS。
- 使用 C++ 工作负载的游戏开发现在安装了支持 Visual Studio 2022 的最新 Unreal Engine。
代码分析改进
- 代码分析现在强制检查用
_Check_return_
或_Must_inspect_result_
批注的函数的返回值。 - 改进了代码分析工具中的空指针取消引用检测。
- 添加了对
gsl::not_null
的支持以进行代码分析。 - 支持
/fsanitize=fuzzer
编译器选项下的 Libfuzzer。
旧版本的发行说明
还提供了 C++ 先前版本的发行说明:
- 有关 Visual Studio 2019 中 C++ 新增功能的信息,请参阅 Visual Studio 2019 中 C++ 的新增功能。
- 有关 Visual Studio 2017 中 C++ 新增功能的信息,请参阅 Visual Studio 2017 中 C++ 的新增功能。
- 有关早期版本中新增功能的信息,请参阅 Visual C++ 2003 到 2015 的新增功能。
已知问题
C++ IntelliSense
若要详细了解 Visual Studio 2022 中关于 C++ 的其他待解决问题和可用解决方法,请参阅 C++ 开发者社区问题列表。
反馈和建议
欢迎咨询! 可使用安装程序或 Visual Studio IDE 右上角的“发送反馈”图标,或者通过“帮助”>“发送反馈”来报告问题或提出功能建议 。 可在 Visual Studio 开发者社区跟踪你的问题,也可在这里添加评论和查找解决方案。 此外,还可通过实时聊天支持获得免费安装帮助。
博客
充分利用 Microsoft 开发人员博客网站中提供的见解和建议,及时了解所有新版本。 这些博客包括对各种功能的深度探讨。 C++ 团队博客和 Visual Studio 博客尤其令人感兴趣。