JetBrains Rider 2025.2 Help

C++ 中的代码分析

JetBrains Rider 的代码分析关键功能也支持 C++。 您可以在 代码分析 部分的相关主题中找到这些功能的详细信息。 在该部分的主要主题中,您还可以找到功能矩阵并检查 C++ 中具体支持的内容。

在本主题中,您可以找到一些使用 C++ 代码分析功能的示例。

默认情况下, 代码检查快速修复上下文操作在所有解决方案文件中可用。 如果需要,您可以通过 在解决方案外部的文件中启用检查、快速修复和上下文操作 复选框在 JetBrains Rider 设置 语言与框架 | C++ | 检查 页的 Ctrl+Alt+S 中启用这些功能,以支持解决方案引用的外部文件。

代码检查

JetBrains Rider 的静态代码分析可以检测到 C++ 文件中的大多数编译器错误和一些编译器警告。

此外,它还会发现其他代码问题,这些问题通常会在运行时被发现。 例如,在构造函数中使用虚方法会导致意外行为,如 此 StackOverflow 问题 中所述。 JetBrains Rider 在您编译之前就指出了这个问题:

JetBrains Rider 警告。 构造函数中的虚方法

分析是通过将 代码检查 应用于 当前文档任何指定范围 来执行的。

UE 项目中的代码检查结果

要了解 JetBrains Rider 提供的代码检查类型,请查看 JetBrains Rider C++ 代码检查的完整列表

有关代码检查的更多信息,请参阅 配置代码检查设置

要快速关闭特定检查或抑制所有检查,请使用检查上下文菜单:

禁用 C++ 中的检查

您还可以使用特定于 JetBrains Rider 的属性来抑制某些检查。 请在 使用属性优化检查 部分中查看详细信息。

快速修复

快速修复让您可以自动解决代码检查发现的大多数代码问题。 如果某个代码问题有一个或多个快速修复可用,当您的光标位于高亮代码上时,您将看到相应的 操作指示器。 按 Alt+Enter 查看并应用所需的修复。

JetBrains Rider 为 C++ 提供了超过 290 个快速修复。 以下是一些示例:

添加缺失的 #include 指令

如果您使用了在标准库或解决方案的其他地方定义的符号,JetBrains Rider 会帮助您自动添加缺失的 #包含 指令:

JetBrains Rider:帮助自动添加缺失的 C++ include 指令

您可以使用 JetBrains Rider 设置 语言与框架 | C++ | 检查 页的 显示导入操作的弹出窗口 复选框 Ctrl+Alt+S 来禁用弹出窗口。

如果未选中复选框,当您按下 Alt+Enter 时,相应的操作将出现在 操作列表中。

添加前置声明

JetBrains Rider 还可以为未解析的符号生成前置声明:

JetBrains Rider:添加前置声明的快速修复

添加 [[maybe_unused]]

可以添加 [[maybe_unused]] 属性以避免编译器对未使用的名称或实体发出警告。 当光标位于未使用的实体上时,将会提供以下快速修复:

添加 [[maybe_unused]]

另一个上下文操作将帮助您将 UNREFERENCED_PARAMETERQ_UNUSED 的用法替换为 [[maybe_unused]] 属性:

添加 [[maybe_unused]]

添加到捕获列表

如果局部变量在 lambda 主体中使用但未被该 lambda 捕获,JetBrains Rider 会建议快速修复以更新捕获列表。 You can capture the variable or this by value, by reference, or implicitly capture all the used automatic variables:

JetBrains Rider C++:更新捕获列表的快速修复

更改返回值类型

如果函数返回类型与实际返回的值不匹配,JetBrains Rider 允许您快速修复返回类型:

JetBrains Rider 帮助修复变量和字段的类型

更改变量类型

如果变量或字段的指定类型与分配的值不匹配,JetBrains Rider 提供快速修复以在声明中使用正确的类型:

JetBrains Rider 帮助修复变量和字段的类型

创建声明

如果 C++ 文件中的成员函数在头文件中没有声明,JetBrains Rider 会根据实现的签名帮助您创建缺失的声明:

为 C++ 类成员生成声明

根据用例创建

如果您使用了未声明的符号,JetBrains Rider 会根据用法建议一个或多个快速修复来创建该符号:

从使用中生成 C++ 字段

初始化成员

如果 JetBrains Rider 检测到未初始化的类型成员,它会建议在一次修复中初始化所有成员。 您还可以使用此修复的子菜单为特定成员生成初始化。

JetBrains Rider C++:初始化成员的快速修复

初始化变量

JetBrains Rider 检测到未初始化的变量并帮助使用默认值初始化它们:

JetBrains Rider 帮助初始化 C++ 中的变量

移除未使用的 #include 指令

所有未使用的 #包含 都会被高亮显示,并可以通过快速修复轻松移除:

移除未使用的 #include 指令

移除未使用的 lambda 捕获

如果局部变量被 lambda 捕获但未在 lambda 主体中使用,JetBrains Rider 会通知您并建议移除未使用的捕获:

移除未使用的 lambda 捕获

将点 (.) 替换为箭头 (->),反之亦然

如果点运算符 错误地应用于指针,JetBrains Rider 会帮助您将其替换为箭头运算符 ->

JetBrains Rider 帮助将点运算符替换为箭头运算符

反向快速修复也可用:

JetBrains Rider 帮助将箭头运算符替换为点运算符

在 lambda 中使用显式模板形参

JetBrains Rider 检测到 lambda 可以重写为使用新的 C++20 模板语法:

在 lambda 中使用显式模板形参

如果参数的类型是右值引用,您可能希望直接将该类型传递给 std::forward。 在这种情况下,您可以使用熟悉的完美转发语法:

完美转发语法

使用 static_cast

JetBrains Rider 检测到应该优先使用 static_cast 的情况,并帮助您更新代码:

  • 使用函数式风格的强制类型转换代替 C++ 类型转换:

    使用函数式风格的强制类型转换代替 C++ 类型转换
  • 在将类型转换为 void* 时,使用 reinterpret_cast 而不是 static_cast

    在将类型转换为 void* 时使用 reinterpret_cast 而不是 static_cast

使用属性优化检查

您可以为源代码中的符号添加特定于 JetBrains Rider 的属性,以使 JetBrains Rider 更准确、更深入地分析您的解决方案。 JetBrains Rider 允许您使用以下自定义属性: [[jetbrains::format]][[jetbrains::guard]][jetbrains::pass_by_value]][[jetbrains::has_side_effects]]

[[jetbrains::format]] 属性允许您为自定义的类似 printf 的函数启用格式检查,并以类似于 [[gnu::format]] 的方式工作。

[[jetbrains::format]]

[[jetbrains::pass_by_value]] 属性允许您抑制“按 const 引用传递值”检查。 为什么使用抑制属性而不是通过注释禁用检查? 当您不希望看到特定类或结构的警告时,您始终可以从 Alt+Enter 菜单中选择 检查:… | 使用注释禁用一次 ,以添加注释来抑制当前行或文件中的检查。 然后,您将不得不为所有类的使用添加抑制注释。 在这些情况下,在类声明中一次性指定抑制属性要容易得多。

[[jetbrains::pass_by_value]]

[[jetbrains::guard]] 属性可用于抑制“局部变量从未使用”检查。 使用此属性标记一个类,以便 JetBrains Rider 知道该类在其构造函数中执行了重要工作。

template<class Mutex> class [[jetbrains::guard]] my_lock_guard { explicit my_lock_guard(Mutex &); };

[[jetbrains::has_side_effects]] 属性允许您将 运算符= 标记为具有副作用,以抑制“分配的值从未使用”检查。

struct A { A& operator = (int); [[jetbrains::has_side_effects]] A& operator = (float); }; void foo(A a) { a = 3; // warning "Assigned value is never used" a = 3.f; // no warnings here a = A(); // warning "Assigned value is never used" }

如果您需要将 JetBrains Rider 属性应用于外部库中的库类,可以在前置类声明中使用该属性: class [[jetbrains::pass_by_value]] my_class;

如果您的编译器显示关于未知属性的警告,您可以使用 __JETBRAINS_IDE____RESHARPER__ 宏来保护声明:

#ifdef __JETBRAINS_IDE__ class [[jetbrains::pass_by_value]] my_class; #endif

让 JetBrains Rider 忽略特定代码

为了从代码分析、导航和其他功能中排除解决方案代码的部分内容,JetBrains Rider 允许您以不同方式 忽略特定文件、文件夹和文件掩码

最后修改日期: 2025年 9月 26日