ReSharper C++ 最新变化

ReSharper C++ 2020.3 实现了 C++20 比较规则并添加新检查,帮助您采用 C++20 范围库,朝着完全 C++20 支持又迈出了一步。 Push-to-Hint 内嵌提示和新的导航功能将让您的日常开发更加舒适。 Unreal Engine 开发者可以利用与 UnrealHeaderTool 的编辑器集成、改进的项目模型以及基于 HLSL 着色器文件内控制流分析的新检查功能。

下载

30天免费试用

Unreal Engine

ReSharper C++ 2020.3 提供了与 UnrealHeaderTool 的无缝集成,帮助您直接在编辑器中捕获有关 Unreal Engine 类元数据的更多问题。 处理 Unreal Engine 项目时,ReSharper C++ 将在您正在编辑的文件上自动运行 UnrealHeaderTool,并显示任何错误或警告,就像其他检查一样。 观看实际运行中的 UnrealHeaderTool 集成

UE 更新模型

为了让您始终保持最新状态,ReSharper C++ 现在可以实时跟踪 Unreal Engine 属性,并在您保存 .Build.cs.Target.cs.uproject.uplugin 文件中的任何变更时立即重新生成项目模型。

Unreal Engine 模型

ReSharper C++ 2020.3 加强了与 Unreal Engine 编码标准的一致性。 例如,ReSharper C++ 现在建议使用 MoveTemp(相当于 Unreal Engine 的 std::move)转换到 rvalue 引用。

C++20 对比

ReSharper C++ 2020.3 完全支持 C++20 比较规则。 其中包括比较运作方式的重大变更,将允许语言重写比较表达式或反转参数的顺序。 现在,您可以查阅工具提示,了解如何重写表达式。 当无法解析比较运算符时,错误消息将列出所有可能的重载候选。

C++20 还增加了默认的比较运算符。 如果您不确定类中的默认比较运算符为什么被隐式删除,可以查看详细的工具提示消息找出确切原因。 ReSharper C++ 现在还可以推断默认三元比较运算符的返回类型。

IncludeCompareFix

新的快速修复允许您向源文件快速添加 #include <compare> 指令,这是使用返回标准比较类别的三元比较运算符(如 std::strong_ordering)时的必需条件。

CreateOperatorFix

Create operator from usage 快速修复已更新,也可支持 C++20 比较规则。 现在,除了非成员版本外,您还可以创建运算符的成员版本和友元版本。 对于可以用主要运算符重写的次要运算符,您可以选择创建主要运算符或次要运算符。

代码分析

ReSharper 控制流分析的全部功能现在登陆 HLSL 着色器文件,包括对不可到达的代码、未初始化变量、冗余控制流跳转和条件分支等问题发出警告。

ReSharper C++ 2020.3 提供了两个带有快速修复的检查,帮助您采用新的 C++20 范围库并使代码现代化:

  • 可以使用在范围上运行的算法。
  • 可以使用 std::views::keys/values
算法快速修复

新检查会建议将接受一对迭代器的标准算法的用法替换为接受一个迭代器和一个计数的等效算法(如果可以)。

Clang-Tidy

捆绑的 Clang-Tidy 二进制文件已更新为 Clang 11,添加了来自最新 LLVM 版本的新检查和编译器诊断

Push-to-Hint 内嵌提示

Push-to-Hint

ReSharper C++ 提供多种内嵌提示。 尽管所有提示都可在某些情况下提供帮助,但我们也收到一些反馈,大家表示有时它们可能会让人不知所措。 为了解决这个问题,我们为内嵌提示推出了新的“Push-to-Hint”机制。 在 Push-to-Hint 可见性模式下,提示仅在您按住 Ctrl 或按两次 Ctrl 后显示。

提示可见性

我们确保可以为每种 C++ 内嵌提示分别配置可见性模式。 您可以使用上下文菜单快速更改给定提示的可见性模式,或转到 Environment | Inlay Hints | C++ 下的新选项页面查看所有设置。

代码补全

反三元

新的上下文操作可帮助您反转三元运算符表达式。

联接声明和赋值

现在,在读取前在所有路径中重新分配局部变量的情况下,可以使用“Join declaration and assignment”快速修复。

启用导入补全后,补全列表将从当前文件未包含的头文件中建议不完整类的合适成员。

除了添加 include 指令或前向声明的选项外,导入补全现在还建议一个新选项,为相应的类添加一个详细的类型说明符。

代码补全

我们为接受宏常量的库函数改进了参数代码补全。 现在,适用于当前参数的库宏常量在补全列表中具有高优先级。 这种启发式方法适用于标准库、WinAPI 和 OpenGL 中的函数。

导航和搜索

模糊搜索

除了常规搜索外,Find Text 现在还可以执行模糊搜索,这意味着它会考虑可能的拼写错误和单词遗漏。 如果您正在查找用作文本格式化函数(如 printfstd::format)参数的特定格式字符串,这个功能会非常实用。

浏览预处理程序指令

您现在可以使用 Go to Declaration 在匹配的预处理程序指令之间跳转,例如条件预处理块的分支,或者单个文件中相同宏的 #define#undef

Go to Declaration 也可用于快速导航至基本函数 - 只需在 override 关键字上调用。

C++ 已支持 Peek ImplementationsPeek Base Symbols,这使您可以在弹出窗口中查看和编辑代码,无需离开正在编写的代码。

文件结构

为了提高可读性,File Structure 现在对嵌套的命名空间使用 C++17 语法,即使您的代码库中尚未采用新语法。

Go to Derived Symbols

Go to Derived Symbols 适用于C++/CLI 属性内的 get/set 函数,以及 C++/CLI 事件内的 add/remove 函数。

其他变更

  • C++20 支持已根据 Visual Studio 16.8 中的标准一致性更新进行改进。 尤其是,ReSharper C++ 现在同时支持 C++ 协同程序的标准和扩展模式,以及新的 <coroutine> 头。
  • 由于缩小了搜索范围,我们得以提高 Find Usages 和 Rename 操作用于私有类成员时的性能。

查看 ReSharper 最新变化,了解 ReSharper 平台的其他变化。 例如,命令行工具现在支持插件,您可以在一组特定的文件或文件夹上,而不是整个解决方案上,调用 CleanupCode

下载

30天免费试用

ReSharper C++ 2020.2

Unreal Engine

Unreal Engine

为了提高自动导入和代码补全的准确性,ReSharper C++ 2020.2 引入了对 Unreal Engine 项目模型的支持。 这意味着,ReSharper C++ 现在可以从 .uproject 文件直接读取项目信息,而不必使用 Visual Studio 生成的中间项目文件。 这一新项目模型提供了更优化的建议项列表,这些建议项取决于插件和模块引用。 ReSharper C++ 还会在您切换解决方案配置时调整其行为。

如果项目文件过期,ReSharper C++ 现在也会提醒您在 Unreal Editor 中刷新 Visual Studio 项目。

Unreal Engine

为了更方便地导航,引擎源中的符号现在会被视为库符号,且如果用户代码中有匹配的符号,这些引擎源中的符号就会在搜索结果中默认隐藏。

Unreal Engine

为了符合 Unreal Engine 编码标准ReSharper C++ 2020.2 对检查严重性、代码生成操作和 include 指令的自动导入进行了一些更新。

而且,包含快速修复的新检查现在可用于将 virtual 说明符添加到重写函数。

C++/CLI

ReSharper C++ 2020.2 提供了许多错误修复并对 C++/CLI 与 C# 之间的互操作进行了改进。 在 C++/CLI 代码中查找派生符号时,ReSharper C++ 除了会在 C++/CLI 中查找符号外,还会在 C# 代码中查找符号。 导航到基本和派生符号也适用于导入的 CLR 实体。

包含快速修复的新代码检查现在可用于 gcnewsealedsafe_cast 用法。

导航和搜索

导航

以下功能的范围和适用性得到扩展:

  • Go to declaration 可以在未解析的说明符上运行,以帮助您了解出错的地方。
  • Find usages 会从更多用例(包括返回声明)中带大括号的初始值设定项列表内查找构造函数用法。 得益于多个修复,Find usages 已获得了性能提升。
  • Go to Base SymbolsGo to Derived Symbols 现在可以在导入的 CLR 实体上运行。
导航和搜索

您在代码中移动时,ReSharper C++ 现在可以自动高亮显示脱字符号下元素的用法。

File Structure 窗口中,预处理程序指令现在默认隐藏,这样您就可以更轻松地在大文件中导航。

代码分析

代码分析

新检查具有相应的快速修复,可以帮助您处理以下用例:

  • 结构化绑定可用于使代码现代化。
  • 重写函数不具有 virtual 说明符。
  • 无法在原生类型上使用 gcnew 且无法在托管类型上使用 new。
  • final 说明符不能用于托管类。
代码分析

ReSharper C++ 现在还会高亮显示预处理程序指令的拼写错误。

得益于 Clang-Tidy 快速修复的简要预览,现在可以更轻松地选择所需修复选项。

代码分析

评估引擎已更新,支持修改 constexpr 函数中的值并可以处理类类型的值。

代码补全

代码补全

预期为 std::function 参数时,新补全项可以插入自动生成的 lambda 参数。

代码补全

如果当前文件中不包含类,导入补全将建议新选项,以添加前向声明而不包含相应的头文件。

代码样式和格式化

代码样式和格式化

ReSharper C++ 2020.2 添加了三个新设置,以便进行更灵活的配置:

  • 缩进对齐的 ?: 运算符——用于多行三元表达式的格式化选项。
  • 在多行 // 注释中按 Enter 时插入 //——编辑器选项,用于阻止在单行样式中自动扩展多行注释。
  • 仅将引用的 include 作为潜在主标头——对 include 指令进行排序的选项,用于改进主标头检测。
代码补全

#include 顺序设置已移动到单独的选项页面,且现在更容易找到——只需点击 Code Editing | C++ 选项组下的 Order of #includes

最后但同样重要的一点是,格式化引擎现在可以在包含许多宏调用的源文件中更快速地工作。

ReSharper 本身也有一些更新。 例如,代码清理现在可以在保存时自动启动或仅应用到最近修改的文件的更改部分。 您可以在此处详细了解这些改进。

ReSharper C++ 2020.1

C++20

C++20 标准已几乎定稿,ReSharper C++ 引入了对其中另一组功能的支持。

Using enum

Using enum

ReSharper C++ 2020.1 添加了对 using enum 声明的支持,借助此声明,您可以将特定枚举器从作用域枚举扩展到本地范围。 新重构 Introduce Using Enum 可以帮助您将 using enum 声明添加到现有代码。

概念

C++20 概念

对于 C++20 概念,ReSharper C++ 支持约束类型占位符和缩写函数模板的新语法。 改进的不满意约束错误消息可以帮助您了解替换模板时出错的位置。

Using enum

适用于 lambda 的模板语法

ReSharper C++ 还会为使用适用于 lambda 的模板语法建议快速修复,从而帮助您避免错误或统一使用 lambda 和函数。

Unreal Engine

Unreal Engine

ReSharper C++ 2020.1 改进了 Unreal Engine 项目中的 Rename 重构。 现在,它可以更新相应的 *.generated.h include 指令以及前缀为 AFETSU 的相关文件。

ReSharper C++ 检测到 Unreal Engine 项目时,它会调整默认设置以停止建议 Use auto,从而更好地符合 Unreal Engine 指南。 ReSharper C++ 2020.1 还包含控制台变量和日志类别的更新命名规则。 您现在可以从 Search Everywhere/Go to 导航到包含 Unreal Engine 样式枚举的命名空间。

ReSharper C++ 现在终于支持 SpatialOS GDK 和包含虚拟文件路径的 USF 文件了。 了解更多。

HLSL 实验性

HLSL

ReSharper C++ 2020.1 现在为高级着色器语言 (HLSL) 提供初步支持ReSharper C++ 会根据您的默认配色方案高亮显示 HLSL 代码并显示代码元素的嵌入提示和工具提示以及类型信息和文档。 您还可以搜索并快速导航到结构、函数或整个解决方案中的参数、引用的文件和标准库。 为了使 HLSL 体验更完美,ReSharper C++ 为您提供了智能代码补全、自动插入匹配分隔符,等等。

代码分析

代码分析

多个新检查可用于以下问题,并通过相应的快速修复帮助您解决问题:

  • 未使用的 lambda 捕获。
  • 可重写 lambda 以使用显式模板参数。
  • 使用函数样式转换,取代 C++ 转换。
  • 转换为 void* 时,使用 reinterpret_cast 取代 static_cast
代码分析

两个额外功能可以帮助您采用 C++17 maybe_unused 特性:

  • 一个快速修复,可以将 [[maybe_unused]] 添加到未使用的参数或变量。
  • 一个上下文操作,可以将 UNREFERENCED_PARAMETERQ_UNUSED 注解替换为 [[maybe_unused]]

捆绑的 Clang-Tidy 二进制文件已更新为 Clang 10,添加了 70 多项来自最新 LLVM 版本的新检查和编译器诊断

代码补全

补全列表现在会建议标签名称、标准 C++ 特性、新的 std::forward 后缀模板以及基本函数调用的参数。 此外,ReSharper C++ 现在还可以在宏主体中提供代码补全。

编码辅助

编码辅助

ReSharper 中适用于 .NET 的两个知名功能现在终于可以在 ReSharper C++ 中使用了:

  • Rearrange Code 可以快速来回移动代码元素,扩大或缩小当前范围,等等。
  • Complete Statement 可以插入必需的语法元素来完成当前语句并将脱字符号放在合适的位置。

借助改进的输入辅助,您现在可以选择任意的代码段并输入括号、大括号、中括号或引号,以便使用相应的符号环绕选定内容。 代码可读性帮助程序(参数名称提示和类型提示)现在可以用于独立代码。

新的 Document 编辑操作(默认快捷键为 Ctrl+/),让您能够快速地为附近的代码元素生成文档注释,而不必使用上下文操作。

枚举重构

枚举重构

ReSharper C++ 2020.1 引入了两个新的重构来帮助您升级枚举用法:

  • Convert to Scoped Enum 可以将 C 样式枚举声明转换为 C++11 作用域枚举。
  • Introduce Using Enum 可以添加 C++20 using enum 声明并缩短枚举器引用,从而提升代码可读性。

导航

代码导航功能已扩展得更加易于使用:

  • Go to Declaration 可用于注释中的标识符。
  • Search Everywhere/Go to 包含两个新的筛选器类别:概念和命名空间。 在搜索框中输入“/”可以查看所有可用的筛选器。
  • 您现在可以点击中键(点击鼠标的滚动按钮)来调用 Go to Declaration

在 File Structure 窗口中,图标现在包含可以显示类成员可访问性、继承和 virtual/static/pure 说明符的指示器。

include 指令排序

include 指令排序

ReSharper C++ 2019.3 让您可以对 #include 指令排序,重新排列现有组,以及创建由空行分隔的新组。 ReSharper C++ 2020.1 添加了两个新设置来使操作更具配置性:

  • 区分大小写的排序。
  • 按目录对标题分组。

如果在 ReSharper | Options | Code Editing | General Formatter Settings 页面上选中 Read code style form .clang-format style,现在则可以从 .clang-format 文件导入排序设置。

其他变更

ReSharper C++ 2020.1 包含多个其他值得注意的变更:

  • Generate 对话框提供了一个选项,用于使用 C++17 [[nodiscard]] 特性标记生成的 getter 和构造函数。
  • Generate mock functions 支持 GTest 1.10 中引入的 MOCK_METHOD 宏。
  • 新设置 Use named pipes to communicate with child processes 让您可以修复由安全软件导致运行异常的单元测试。

ReSharper 也迎来了更多变更。 例如,现在可以导出和导入单元测试会话。