C++20 模块

ReSharper C++ 2022.3 添加了对自原始 C++98 标准以来最重要的 C++ 更新 – C++20 模块 – 的实验性支持。 模块引入了新的编译模型,您可以将代码拆分为独立编译的组件,而不使用头文件。

在新代码中,您应该使用命名模块,这些模块在 .ixx 模块接口文件中显式声明其接口。 但是为了简化过渡,C++20 还提供了一种通过头单元将现有行为良好的头文件作为模块使用的方式。 ReSharper C++ 现在支持创建和使用模块的两种方式。

首先,ReSharper C++ 现在可以正确处理新语法:引入模块和模块分区的 module 声明、使用其他模块的 import 声明以及模块接口的实体 export。 与 include 指令相同,ReSharper C++ 会警告您 import 声明中未解析的模块名称或路径。

在代码导航中,您习惯的所有功能现在都适用于从模块导入的实体。 通过对模块声明的支持,您现在可以使用 Go to Declaration(转到声明)访问 import 声明中的模块名称,从 File Structure(文件结构)导航到模块声明,并使用 Go to Symbol(转到符号)搜索模块。

如果要快速创建一个模块,您可以使用新的内置文件模板 – Module interface unit(模块接口单元)。 要从文件模板创建新文件,请使用 Ctrl+Alt+Insert 快捷键或从主菜单选择 ReSharper | Edit | Create New File(ReSharper | 编辑 | 创建新文件)。

代码补全是受益于模块支持的功能之一。 代码补全列表现在包括来自所有导入模块和头单元的条目。

这项工作仍未完成,并且存在一些已知限制。 了解详情.

支持 C++

我们引入了对 #pragma pack 指令的支持,该指令可以修改类和结构的当前对齐方式。 ReSharper C++ 现在可以正确计算打包结构的大小。

在 ReSharper C++ 2022.2 中,我们针对 emplace 式和 make 式函数调用实现了大量改进。 然而,这些功能仅限于标准库中的类和函数。 在此版本中,ReSharper C++ 可以显示代码中定义的任何类似函数的形参信息和嵌入提示。

要让 ReSharper C++ 知道函数暗示构造函数调用,请确保函数模板形参受到约束(使用 SFINAE 或 requires 子句),可从给定的实参包构造。

ReSharper C++ 2022.3 引入了对 [[nodiscard]] 的扩展 C++20 版本的支持,其中包括函数或类使用特性标记的原因。 现在,当函数调用的结果未被使用时,您会收到指明原因的更清晰警告。

这个版本还为编译时评估带来改进。 ReSharper C++ 现在可以正确处理各种形式的对象初始化,包括任何类型(默认、隐式生成、继承和用户定义)的构造函数的计算。

我们还改进了对调用约定的支持。 ReSharper C++ 现在能够理解 GNU 风格,可以在支持此语法 (void __attribute__((stdcall)) bar()) 的编译器的函数声明中指定调用约定。

Unreal Engine

如果资产受到符号重命名的影响,Unreal Engine 将不再识别它。 为防止数据丢失,ReSharper C++ 会在您执行 Rename(重命名)重构时建议添加 Core Redirect。 接受后,对应 .ini 文件会自动更新。

Add Core Redirect(添加 Core Redirect)选项此前已可用于 UCLASSUPROPERTY,现在也可用于 UFUNCTIONUSTRUCTUENUM

ReSharper C++ 2022.3 引入了特定于蓝图的新嵌入提示。 您现在可以快速检查有多少蓝图使用标有 BlueprintCallable 说明符的函数,并从提示的上下文菜单中获取所有用法的列表。

ReSharper C++ 不再在自动导入建议中提供来自系统头和着色器文件的不需要的实体。 您可以在 Options | Code Editing | C++ | Unreal Engine(选项 | 代码编辑 | C++ | Unreal Engine)中启用系统头建议。

ReSharper C++ 2022.3 还包括针对最新 Unreal Engine 5.1 版本的更新。

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

代码格式设置

ReSharper C++ 2022.3 提供了与作为替代代码格式化程序的 clang-format 的无缝集成。 格式化文件时,您现在可以在 ReSharper 自己的格式设置引擎与 сlang-format 之间切换。

ReSharper C++ 在单独的进程中运行 clang-format 二进制文件,确保与行业标准格式化程序完全兼容,提供更好的性能和更广泛的格式设置选项。

默认情况下,ReSharper C++ 使用内置 clang-format 二进制文件。 您可以在 ReSharper 选项的 Code Editing | C++ | Formatting Style | General(代码编辑 | C++ | 格式设置样式 | 常规)页面上将 ReSharper C++ 配置为运行其他 clang-format 的二进制文件。

对于喜欢 ReSharper 自己的格式化程序或想通过 Detect formatting settings(检测格式设置)快速设置格式设置样式的用户,ReSharper C++ 2022.3 引入了一些新的格式设置选项来配置:

  • 形参包中省略号 (…) 前后的空格。
  • 声明和代码其余部分中可接受的空行数。
  • 在声明和代码的其余部分中,在左大括号 ({) 之后和右大括号之前保留还是移除空行。
  • 访问说明符前后的空行。
  • 列中枚举器初始值设定项的对齐。

编码辅助

现在,ReSharper C++ 会在形参信息和其他工具提示中显示函数的来源,确定函数是隐式生成(例如构造函数或赋值运算符)、内置(例如基本类型的运算符 +),还是编译器固有(例如带有 __builtin_ 前缀的函数)。

有两个实用的新功能可以帮助您提高条件的可读性:

  • 遵循德摩根定律在布尔表达式中将 &&|| 互相替换的上下文操作。
  • 具有简化求反比较表达式的快速修复的检查。

捆绑的 Clang-Tidy 二进制文件也已更新到 Clang 15,新增了最新 LLVM 版本中的新检查。

查看 ReSharper 最新变化,了解此版本中引入的其他更改。 例如,ReSharper 现在会提醒您与 NuGet 软件包相关的漏洞依赖项。