ReSharper C++ 最新变化

ReSharper C++ 2021.1 引入了对多个 C++20 和 C++17 新语言功能的支持,增加了新的检查并改善了对 Unreal Engine 的支持。 现在,您可以配置 ReSharper C++,让您的代码样式更加紧密地匹配一套新的语法样式设置。 随附的快速修复和上下文操作可帮助您保持代码样式一致并轻松更新代码。

下载

30天免费试用

支持 C++

类类型

ReSharper C++ 2021.1 添加了对非类型模板参数中类类型的支持。 利用此 C++20 功能,当类满足一定要求时,您可以在模板参数的类型中使用自己的类。

CTAD

另一个实用更新是对 C++20 CTAD 规则的支持:类模板参数推导现在适用于聚合模板、类型别名和继承的构造函数。

Noexcept

从 C++17 开始,noexcept 规范已被视为函数类型的一部分,并且 ReSharper C++ 现在完全支持新的异常规范语义

协同程序

在此版本之前,代码补全还不包括对 C++20 协同程序相关语法的支持。 现在,co_awaitco_yieldco_return 在基本代码补全和后缀补全模板中均可用。

代码分析

限制范围

ReSharper C++ 现在将在使用范围之前声明变量时发出通知。 在这种情况下,您可以使用提供的快速修复移动变量并限制其范围

冗余强制转换

另一项新的检查可以检测 redundant cast 表达式,在不更改语义的情况下将其从代码中安全删除。

转换错误

ReSharper C++ 2021.1 为转换错误添加了新的快速修复:针对当前上下文选择对应转换(c_str()to_string() 等)即可解决错误。

冗余模板参数

ReSharper C++ 2021.1 也会高亮显示可由语言根据 C++17 类模板参数推导规则推导的冗余模板参数

语法样式

在 2021.1 版本中,我们引入了一系列语法样式设置,您可以利用这些设置使 ReSharper 遵循所选代码样式并在整个代码库中强制应用。

您可以在 Code Editing | C++ | Syntax Style 页面上自定义语法样式偏好设置。 选定的选项值将同时用于代码生成和代码样式执行。

快速修复

ReSharper C++ 将高亮显示样式违规并提供快速修复进行消除。 所有语法样式快速修复均可在范围内应用,包括函数体或类定义等局部范围。

上下文操作

启用所有样式检查可能会让人不知所措,因此,即使您已禁止了相应的检查,我们也将确保上下文操作始终可用于调整代码。

应用语法样式

要强制执行所选的语法样式,您可以使用代码清理或专用的 Apply Syntax Style 操作,操作将根据当前上下文修复所选内容、整个当前文件或一组文件中的语法样式问题。

声明样式

一些新的语法样式设置可以让您在代码中配置和执行声明的样式。

您可以选择首选 typedefs 还是使用别名声明。 在函数声明中,您可以强制 trailing return types 或将 ReSharper C++ 配置为要求常规返回类型。 您还可以指定是否尽可能使用 C++17 nested namespace 定义。

您可以在变量声明中指定什么时候 ReSharper C++ 应该要求 auto 而非显式类型。 默认情况下,现在仅在从周围上下文中可以确定推导类型时才建议使用 auto

Const

借助 cv 限定符位置的语法样式设置,您可以选择 east constwest const 样式并快速更新代码。

重写

您还可以选择在重写函数和析构函数上使用 virtualoverride 指示符(或两者)。

大括号样式

要求大括号

在 C++ 中,单个嵌套语句的周围可以省略大括号,但在某些情况下,代码样式指南可能仍然要求大括号。 为了帮助您执行大括号样式,ReSharper C++ 增加了使用大括号的语法样式规则。

移除冗余大括号

您可以选择是否始终强制执行大括号,也可以仅对多行语句或多行语句体周围要求使用大括号。 ReSharper C++ 也可以查找和移除不符合所选大括号样式的冗余大括号

代码清理

清理配置文件

所有新的语法样式检查都有相应的代码清理选项,可在自定义配置文件中禁用。 此外,还有两个新的选项可用于移除冗余转换和模板参数列表。

Cleanup selection

借助新的 Cleanup selection 上下文操作,您可以在选定代码范围内快速运行代码清理。 您还可以轻松选择要在运行期间使用的自定义代码清理配置文件。

最后,我们提升了代码清理的性能。 在许多情况下,代码清理现在都将花费更少的时间分析代码并执行更少的操作,在现实世界的代码库上更快地完成工作。

Unreal Engine

我们根据从 Epic Games 团队获得的反馈,引入了对 Unreal Engine 5 的初步支持。

UE Cast

Unreal Engine 用于类型安全动态转换的 Cast 现在作为代码补全中的后缀模板提供。

RIGVM_METHOD

ReSharper C++ 增加了对另一个 Unreal Engine 特定反射宏 RIGVM_METHOD 的支持,并可正确处理。

其他变更

查看 ReSharper 最新变化,了解 ReSharper 平台的其他变化。 例如,添加了导航操作 Navigate to Windows Explorer,以及使用 Copy FQN 功能创建指向 GitHub 源的链接的操作。

下载

30天免费试用

ReSharper C++ 2020.3

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

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