ReSharper C++ 最新变化

ReSharper C++ 2024.1 改进了 C++20 模块支持并在 Call Tracking(调用跟踪)中实现了传出调用。 编码辅助增强包括 Change Signature(更改签名)重构改进、更新的文档注释支持等。 对于 Unreal Engine 开发者,ReSharper C++ 2024.1 带来了对 Slate UI 框架和 C++ 代码中资源路径补全的支持。

下载

可免费试用 30 天

C++20 模块支持

得益于更新的模块发现过程,ReSharper C++ 现在支持内部分区单元,这些模块分区单元不参与模块的外部接口。 也就是说,它们是没有关联的 export module 声明的模块分区。

我们重做了导出的 C++20 模块的内部表示,旨在简化对从其他模块导入的实体的传递引用。 此前,这些实体会从导入它们的模块中重新导出。 我们预计,这一更改将显著减少导出的模块的占用空间并提高使用 C++20 模块的项目的性能。

Unreal Engine

ReSharper C++ 2024.1 引入了对 Unreal Engine 的 Slate UI 框架的支持。 您可以依靠 ReSharper 的代码格式化程序和输入辅助根据 Unreal Engine 的约定设置 Slate 代码格式。 Go to declaration(转到声明)、Find Usages(查找用法)和 Rename(重命名)等功能也已更新,可以理解 Slate 的声明式语法。

ReSharper C++ 与蓝图功能的集成进一步发展,支持在重命名 UENUM 实例时添加核心重定向,C++ 代码中的资源名称获得资产路径补全。

着色器代码现已支持用于动态着色器链接的 HLSL 接口。

如果您对用于 Unreal Engine 开发的独立跨平台 IDE 感兴趣,请选择 Rider。 Rider 中的 Unreal Engine 支持与 ReSharper C++ 保持一致,您可以在 Rider 2024.1 更新中期待相同改进。

Call Tracking(调用跟踪)中的传出调用

除了对跟踪传入调用的现有支持外,ReSharper 的 Call Tracking(调用跟踪)现在还支持传出 C++ 调用链导航。 要探索传出调用,首先将文本光标置于任意函数处,然后从上下文菜单选择 Inspect | Outgoing calls(检查 | 传出调用)。 或者,您也可以按 Ctrl+Shift+Alt+AInspect This(检查此)菜单调用。

Change Signature(更改签名)改进

通过 Change Signature(更改签名),您可以在指针、引用或值类型之间轻松更改函数形参的类型。 ReSharper 将自动更新函数体内的形参用法,并在函数调用点调整函数实参,根据需要添加解引用或 address-of 运算符。

如果在依赖代码中具有潜在用法的函数上调用 Change Signature(更改签名),该重构现在让您可以验证更改并确认需要更新哪些用法。

您现在还可以为使用 Change Signature(更改签名)添加的新函数形参指定默认实参。

Change Signature(更改签名)的其他显著更新:

  • 可变参函数模板的改进处理。
  • 为宏调用内的调用点正确更新函数实参。
  • Change Signature(更改签名)现在会保留数组类型和 unsigned int 类型中的 int 类型说明符。

文档注释

您现在可以自定义生成的文档注释的样式,无需编辑实时模板。 要配置文档注释的样式,请转到 ReSharper 的 Settings | Code editing | C++ | Code generation(设置 | 代码编辑 | C++ | 代码生成)。

JetBrains Grazie 是 ReSharper 的新内置语法和拼写检查器,在 ReSharper 2023.3 中引入。 在 2024.1 版本中,C++ 文档注释也可以使用 Grazie 驱动的语法检查。

Change Signature(更改签名)重构现在会使 @param 命令与函数形参列表保持同步。 此重构为已移除形参删除了 @param 命令,为新形参添加了命令,并重新排列了现有命令来匹配所包含形参的新顺序。

代码分析

根据 Richard Thomson 维护的 C++ 重构工具综合测试套件的最新结果,ReSharper C++ 通过了最多的测试用例,继续优于其他工具。 同时,我们持续提高 ReSharper 建议的质量,在 ReSharper C++ 2024.1 中解决了 Richard 的测试套件发现的几个问题。 例如,Create constructor from usage(从用法创建构造函数)快速修复现在会根据需要添加默认构造函数。

ReSharper C++ 2024.1 现在会建议移除聚合初始化中的冗余惯用零初始值设定项。 一些新检查会发现 static 数据成员的各种问题,例如 static constexpr 数据成员上的冗余 inline 说明符。

代码清理添加了新条目,可以移除冗余可访问性说明符并将没有继承者的类设为 final。 除了局部变量之外,Apply 'auto' style(应用 'auto' 样式)现在还可以处理全局变量和类成员。

如果您想禁止特定作用域内的检查,此前可以使用 ReSharper 特定的 // ReSharper disable 注释。 ReSharper C++ 2024.1 还可以识别 clang-tidy 使用的 NOLINTNOLINTNEXTLINENOLINTBEGIN ... NOLINTEND 注释。

代码格式设置

ReSharper C++ 2024.1 引入了多个新的格式设置选项:

  • Break line after goto labels(在 goto 标签后换行)和 Indent goto labels(缩进 goto 标签)增强了带标签的语句的格式设置。
  • Arrangement of enumerations(枚举排列)下控制枚举内换行的设置。
  • Empty braces formatting(空大括号格式设置)现在包含 Do not change(不更改)选项。

使用 .clang-format 配置时,ReSharper 的格式化程序现在会考虑 DisableFormatIndentAccessModifiers 设置。 GNU 内置 clang-format 样式也已得到支持。

查看 ReSharper 最新变化页面,了解此版本中引入的其他更改。

下载

可免费试用 30 天

ReSharper C++ 2023.3

AI Assistant 预览阶段结束 正式版

JetBrains AI Assistant 现已全面推出,搭载大量新功能和改进,助力提高您的工作效率。 我们最新的改进包括更好的 AI Actions(AI 操作)项目感知和一个提示库。

订阅 JetBrains AI Service,在 ReSharper C++ 中以补充功能的形式使用 AI Assistant。

HLSL 和 Unreal Engine 更新

HLSL 2021 引入了 C++ 式模板函数和数据类型。 最新的 ReSharper C++ 更新提供了对 HLSL 模板的全面支持。

ReSharper C++ 2023.3 引入了对 HLSL 内置 RayQuery 类型的支持,增强了代码补全,可给出相应的标志建议。

一项新的检查可以帮助您避免落入 AddDynamic 帮助程序宏的一个常见陷阱。 现在,当动态委托函数未添加 UFUNCTION 宏标记时,您会收到警告。

如果您仍然发现自己偶尔会编写样板代码,不要忘记,使用 Alt+Insert 快捷键可以自动生成常见类型成员。 在 ReSharper C++ 2023.3 中,我们调整了哈希函数的生成以遵循 Unreal Engine 约定。

如果您对用于 Unreal Engine 开发的独立跨平台 IDE 感兴趣,请选择 Rider。 Rider 中的 Unreal Engine 支持与 ReSharper C++ 保持一致,您可以在 Rider 2023.3 更新中期待相同改进。

C 和 C++ 支持

如果您需要检查某些特定特性在当前标准版本或编译器版本中是否可用,C++20 的功能测试可以帮您节省很多时间。 通过在预处理程序条件中使用 __has_cpp_attribute(operand),可以测试编译器是否可以识别其操作数引用的特性。 ReSharper C++ 现在可以正确地处理 __has_cpp_attribute,以更好地支持 C++ 标准库中的特性注解。

我们引入了对与 __pragma 关键字一起使用的 pack pragma 的支持。 __pragma (pack) 语法有时会在宏定义中使用,因为在宏定义中无法使用 #pragma 指令。 在这种情况下,ReSharper C++ 现在可以正确计算打包结构的大小,因此您可以依赖代码分析结果。

ReSharper C++ 添加了对多个 C 功能的支持:

  • 可以在指针声明中使用的 C99 restrict 类型限定符。
  • C23 中的类型推导、constexprnullptr

我们还引入了对多个新的 clang 内部函数的支持,如 __is_const()__is_member_pointer() 等,使 ReSharper C++ 更好地处理跨平台代码。

对于跨平台 C 和 C++ 开发,您可以试一试独立 CLion Nova IDE 的抢先预览版。 它由 ReSharper C++ 提供支持,目前完全免费使用 – 只需注册,开始编码,并向我们发送您的反馈!

语法和拼写检查

JetBrains Grazie 已成为 ReSharper 的新内置语法和拼写检查工具。 Grazie 支持 20 多种语言,能够在 ReSharper 支持的编程语言(C#、C++、VB.NET)、标记语言(HTML、XML、XAML)和注释中捕捉自然语言错误。 要将其他自然语言添加到 Grazie,请在 ReSharper 中转到 Options | Grammar and Spelling | General(选项 | 语法和拼写 | 常规)。

请注意,目前无法在 doxygen 注释中进行语法检查。

处理停用代码

对于针对特定平台或针对特定配置的代码,您可能经常发现自己在条件预处理程序分支中编辑当前停用代码块。 以前,停用代码中的代码补全仅提供宏。 在 ReSharper C++ 2023.3 中,我们改进了这些场景中的代码补全,以包括全局作用域中的符号。

Find Usages(查找用法)现在会查找停用代码和宏主体中的可能用法。 以前,如果您想要查找这些用法,必须使用 Find Usages Advanced(高级查找用法)并调查文本实例。 现在,Find Usages(查找用法)结果中默认包含宏主体和停用代码中的潜在用法。 这些用法被分组到单独的部分中,以便与有效代码中的用法区分。

代码分析

您可以使用 ReSharper 特定的 C++ 特性,使 ReSharper 能够更准确、更深入地分析您的解决方案。 在 ReSharper C++ 2023.3 中,除了 [[rscpp::...]] 外,我们还为现有的 [[jetbrains::format]][[jetbrains::guard]][[jetbrains::has_side_effects]] 特性添加了 [[jetbrains::...]] 前缀。

新的 [[jetbrains::pass_by_value]] 特性让您可以禁止函数形参的 Pass value by const reference(通过常量引用传递值)检查。 了解详细信息

我们引入了一组检查,可以检查 C++20 模块中 export 关键字的错误用法。 现在,当另一个 export 声明中已包含该声明,或者该声明不属于模块接口单元并且无法导出时,ReSharper C++ 会建议移除 export。 如果您尝试将 export 声明模板化而不是导出模板声明,您还会获得移动 export 的建议。

我们已经将捆绑的 clang-tidy 二进制文件升级为 Clang 17,引入了最新 LLVM 版本中的更新。

除警告文本外,一些 clang-tidy 检查还会输出更多详细信息。 ReSharper C++ 现在会在工具提示中显示这些附加说明。

一项新的检查会对多字符文字的用法发出警告。 多字符文字通过实现定义的值获得有条件的支持,在可移植代码中应谨慎使用。

ReSharper C++ 现在会给出快速修复建议,以移除冗余的条件运算符并简化三元条件表达式。

编码辅助

Alt+Insert Generate(生成)菜单可以帮助您快速创建样板代码。 在 ReSharper C++ 2023.3 中,我们在列表中添加了一个新操作,可供生成析构函数。

在多态类中调用时,该操作会使用语法样式设置插入必需的 virtual 和/或 override 说明符。 可以在 Code Editing | C++ | Code Generation(代码编辑 | C++ | 代码生成)选项页面中配置生成的析构函数的主体样式。

使用 #pragma region#pragma endregion 指令,可以指定一个可折叠的代码块。 与其他匹配指令类似,您现在可以在 #pragma 指令或带有区域名称的新嵌入提示上使用 Go to Declaration(转到声明)操作在两者之间跳转。

此外,您现在还可以在 File Structure(文件结构)窗口中方便地折叠区域并导航到相应的代码块。

在 C 代码中,应该在函数的形参列表中使用 void,以表明该函数不需要任何实参。 现在,当您调用 Extract method(提取方法)或 Change signature(更改签名)重构、生成函数定义或根据其用法创建新函数时,ReSharper C++ 会保留这个特殊的 void

引用嵌入提示现在有一个单独的 [>>] 文本,因此您可以一目了然地发现转发引用。

新的 Generate inline definitions(生成内联定义)操作可以让您同时快速生成多个函数的主体。 与现有的 Generate definitions(生成定义)类似,在编辑器中选择一个类名或多个函数声明时,可以使用这项新操作。

在嵌套表达式中调用 Introduce variable(引入变量)或 Introduce field(引入字段)重构时,ReSharper C++ 现在可以让您明确选择目标表达式,而不是自动使用最外层的表达式。

为了改善代码导航体验,现在,通过宏替换获得的符号会在 Go to(转到)和 File Structure(文件结构)窗口中隐藏。 这对在扩展过程中引入许多辅助符号的宏很有用,比如流行的单元测试框架中的测试用例声明。

代码格式设置

ReSharper C++ 2023.3 引入了多个新的格式设置选项:

  • 在尾随返回值类型中的 -> 之前换行。
  • 在尾随返回值类型中的 -> 之后换行。
  • 空块内的空格。
  • 允许在 { 之后添加注释。

我们还将捆绑的 clang-format 二进制文件升级为 Clang 17,并实现了在从 .clang-format 配置中导入格式化程序设置时以及在使用 clang-format 而不是内置格式化程序时对 InsertNewlineAtEOF clang-format 设置的支持。

查看 ReSharper 最新变化页面,了解此版本中引入的其他更改。

ReSharper C++ 2023.2

AI Assistant 限定访问

AI Assistant 不与 ReSharper 捆绑,必须单独安装。 目前,我们还推出了一个等候名单来管理使用 AI Assistant 功能的请求。

有关 AI Assistant 的更多信息以及如何通过 Toolbox App 或 dotUltimate 安装程序进行安装的说明,请参阅我们的网络帮助

ReSharper C++ 2023.2 引入了 ReSharper AI Assistant – 这种 AI 驱动聊天工具专门用于回答编程问题,帮助您进行故障排除、重构、记录和其他开发工作流。

ReSharper 的 AI Assistant 会考虑项目中使用的语言和技术。 这种上下文感知可以立即调整其响应,节省您的时间和精力。

您可以随意在查询中包含部分源代码。 ReSharper 将检测您发送或粘贴到聊天中的代码并将其正确格式化,AI 模型将解释代码背后的逻辑并帮助您重构、查找问题或记录。

C++23 支持

if consteval 语句是 C++23 中新增的常量求值功能,它进一步发展了 C++20 constevalstd::is_constant_evaluated() 的思想。 如果 if consteval 语句的求值发生在常量求值期间,则执行以下复合语句。 否则,执行 else 分支。

ReSharper C++ 引入了对 if consteval 的支持并带来了一组相关检查:

  • consteval if 始终为常量。
  • std::is_constant_evaluated 始终求值为常量。
  • if 可被替换为 if consteval

ReSharper C++ 现在支持 C++23 标准库中引入的命名模块 stdstd.compat。 在 Visual Studio 17.6 或更高版本上,您现在可以使用 import stdimport std.compat 导入整个标准库,而不是使用预编译头或包含特定的标准库头。

在 C++23 之前,所有运算符都必须是非 static 成员函数。 不过,调用运算符通常与无成员函数对象一起使用,在这种情况下允许运算符为 static 可以产生更高效的代码。 C++23 允许 operator()operator[] 都为 static。

C++20 支持

我们一直在完善 C++20 模块支持,修正了使用模块的实际项目中的各种角落问题。 在内部处理模块时,ReSharper C++ 现在实现了舍弃 decl 不可达声明的选项,显著提高了在全局模块片段中包含大量头的模块的性能。

此外,我们还实现了一些更改,更好地支持 CMake 项目中的模块。 ReSharper C++ 现在将 .cppm 文件识别为模块接口,并包括对位于项目文件夹外部的模块的实验性支持。

C++20 新增的 [[no_unique_address]] 特性表明类的非 static 数据成员不需要唯一地址,允许编译器以更有效的方式布局类的成员。 现在,ReSharper C++ 在计算对象的大小时会考虑 [[no_unique_address]]

ReSharper C++ 2023.2 还实现了最近接受的 C++20 缺陷报告,该报告允许使用 UTF-8 字符串文字初始化 charunsigned char 字符数组。

Safe Delete(安全删除)重构

ReSharper C++ 引入了 Safe Delete(安全删除)重构,让您可以从源代码安全移除符号。 这种重构适用于类、函数、变量、枚举器、命名空间,甚至概念。

要调用重构,首先将文本光标置于要删除的符号上,然后按 Alt+Del,或从 Refactor This(重构此)菜单选择 Safe Delete(安全删除)。

删除符号之前,ReSharper C++ 会搜索其用法并让您预览源代码更改,帮助您确定移除没有错误。 尝试删除类或命名空间等复杂实体时,ReSharper C++ 将递归检查其所有成员的用法。

Unreal Engine

这个版本为蓝图索引编制带来了性能改进。 当您第一次打开项目时,ReSharper C++ 将为所有蓝图资源编制索引,驱动 Find Usages(查找用法)等功能,并直接在文本编辑器中显示序列化数据的值。

先前,ReSharper C++ 会以与 C++ 代码相同的优先级对这些资源编制索引,导致项目需要较长准备时间才能开始工作。 ReSharper C++ 2023.2 将在对 C++ 代码编制索引后在后台对资源编制索引,不会干扰您的工作。

我们使用标准赋值语义改进了包装器类型的智能补全。 例如,赋值给 TEnumAsByte 类型的变量时,补全将从底层枚举类型建议枚举器。

对于 Unreal Engine 5.1 项目,我们引入了对 UE_INLINE_GENERATED_CPP_BY_NAME 宏的支持,可将生成的文件内联到模块中以缩短编译时间。

编码辅助

通过改进依赖代码的补全,当类型受概念或特征限制时,您将获得补全条目。 ReSharper C++ 现在会考虑标准 std::is_same/std::is_base_of 类型特征、其 _v 值别名、相应的 std::same_as/std::derived_from 概念,以及 Unreal Engine TIsSame 特征。

为了提供更有用的代码补全建议,ReSharper C++ 现在还从 requires 子句、if constexpr 和 SFINAE 中提取类型和值要求。

两个新增的互补上下文操作可帮助您将模板形参约束移至 requires 子句,以及将 requires 子句转换为模板形参约束。

如果您有递归调用,ReSharper C++ 将在装订区域中标记,使其更加明显。

代码补全列表现在会筛选掉保留的标识符,并仅在 _ 之后建议。 因此,如果没有必要,您就无需滚动浏览标准库中的建议。

ReSharper C++ 2023.1 在 Quick Documentation(快速文档)弹出窗口和悬停工具提示中为宏替换引入了适当的高亮显示和格式化。 在 2023.2 版本中,这些改进也适用于代码补全中的宏定义和 Parameter Info(形参信息)。

我们改进了求值引擎,以支持 constexpr 数组的聚合初始化。

我们改进了与 GCC 和 Clang 编译器以及 libc++/libstdc++ 标准库的兼容性。 这包括对 __integer_pack__is_convertible/__is_nothrow_convertible 等更多内置函数的支持,以及对先前支持的内置函数的更新。

使用 Doxygen param 命令的 [in][in,out][out] 特性指定形参方向时,工具提示现在会从您的注释中获取它们。

代码分析

ReSharper C++ 2023.2 添加了一项新检查,可以用于检测冗余的取消引用和寻址运算符。 它为您提供了多种快速修复,帮助简化成员访问并移除冗余运算符。

另一项新检查可以高亮显示与相应默认模板实参匹配且可以省略的冗余模板实参。

一项新的兼容性检查可以警告您注意没有底层类型的 C 样式枚举的前向声明,这被 C++ 标准所禁止,但被 MSVC 接受,可能导致代码不可移植。

ReSharper C++ 现在根据严重级别高亮显示 #error#warning 诊断预处理程序指令。

捆绑的 clang-tidy 二进制文件也已更新到 Clang 16,提供了新的检查和修正。

MSVC 可以使用传统预处理程序或符合标准的新预处理程序,具体取决于 /Zc:preprocessor 编译器实参的值。 ReSharper C++ 现在从项目属性读取此实参的值,并相应地调整内置预处理程序的行为。

导航

ReSharper C++ 2023.2 对 Go to declaration(转到声明)做出多项改进,使代码导航更加一致、直观,无需额外步骤:

  • 在构造函数调用中调用类名时,Go to declaration(转到声明)现在会导航到构造函数而不是包含的类。
  • Go to declaration(转到声明)现在会导航到第一个 typedef 或类型别名声明,而不是显示所有声明的菜单。
  • 在模块名称上使用 Go to declaration(转到声明)会在同一模块的接口和实现单元之间跳转。
  • #include 路径中的文件夹上使用 Go to declaration(转到声明)会打开文件夹。

此外,Type of symbol(符号类型)现在可用于非声明符符号。 它的工作方式类似于 Go to declaration(转到声明)。

格式化和输入辅助

生成文档注释时,ReSharper C++ 现在将根据编辑器中的注释样式调整文档模板。 对于 /**,输入辅助将生成 /** */ 样式的注释,对于 ///,注释将为 /// 样式。

这个版本对位字段成员的格式化带来了多项改进。 在列中对齐初始值设定项和声明名称的选项现在支持位字段。 还有两个新的格式化设置,用于位字段声明中冒号前后的空格以及列中位字段大小的对齐。

新的输入辅助选项可让您关闭文档注释的生成,避免与 Visual Studio 的内置生成器冲突(ReSharper | Options | Environment | Editor | Behavior | C++, C, HLSL | Generate documentation comments(ReSharper | 选项 | 环境 | 编辑器 | 行为 | C++、C、HLSL | 生成文档注释))。

我们还更新了捆绑的 clang-format 二进制文件并修正了 clang-format 引擎,防止其移除文件末尾的换行符。

查看 ReSharper 最新变化,了解此版本中引入的其他更改。 例如,ReSharper 引入了预测调试器,可以预见执行程序时触发的所有可能状态,无需实际执行。