C++ 中的代码分析
JetBrains Rider 的代码分析关键功能也支持 C++。 您可以在 代码分析 部分的相关主题中找到这些功能的详细信息。 在该部分的主要主题中,您还可以找到功能矩阵并检查 C++ 中具体支持的内容。
在本主题中,您可以找到一些使用 C++ 代码分析功能的示例。
默认情况下, 代码检查、 快速修复和 上下文操作在所有解决方案文件中可用。 如果需要,您可以通过 在解决方案外部的文件中启用检查、快速修复和上下文操作 复选框在 JetBrains Rider 设置 页的 Ctrl+Alt+S 中启用这些功能,以支持解决方案引用的外部文件。
代码检查
JetBrains Rider 的静态代码分析可以检测到 C++ 文件中的大多数编译器错误和一些编译器警告。
此外,它还会发现其他代码问题,这些问题通常会在运行时被发现。 例如,在构造函数中使用虚方法会导致意外行为,如 此 StackOverflow 问题 中所述。 JetBrains Rider 在您编译之前就指出了这个问题:

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

要了解 JetBrains Rider 提供的代码检查类型,请查看 JetBrains Rider C++ 代码检查的完整列表。
有关代码检查的更多信息,请参阅 配置代码检查设置。
要快速关闭特定检查或抑制所有检查,请使用检查上下文菜单:

您还可以使用特定于 JetBrains Rider 的属性来抑制某些检查。 请在 使用属性优化检查 部分中查看详细信息。
快速修复
快速修复让您可以自动解决代码检查发现的大多数代码问题。 如果某个代码问题有一个或多个快速修复可用,当您的光标位于高亮代码上时,您将看到相应的 操作指示器。 按 Alt+Enter 查看并应用所需的修复。
JetBrains Rider 为 C++ 提供了超过 290 个快速修复。 以下是一些示例:
添加缺失的 #include 指令
如果您使用了在标准库或解决方案的其他地方定义的符号,JetBrains Rider 会帮助您自动添加缺失的 #包含 指令:

您可以使用 JetBrains Rider 设置 页的 显示导入操作的弹出窗口 复选框 Ctrl+Alt+S 来禁用弹出窗口。
如果未选中复选框,当您按下 Alt+Enter 时,相应的操作将出现在 操作列表中。
添加前置声明
JetBrains Rider 还可以为未解析的符号生成前置声明:

添加 [[maybe_unused]]
可以添加 [[maybe_unused]] 属性以避免编译器对未使用的名称或实体发出警告。 当光标位于未使用的实体上时,将会提供以下快速修复:
![添加 [[maybe_unused]]](https://resources.jetbrains.com.cn/help/img/rider/2025.2/maybe_unused_attr.png)
另一个上下文操作将帮助您将 UNREFERENCED_PARAMETER 和 Q_UNUSED 的用法替换为 [[maybe_unused]] 属性:
![添加 [[maybe_unused]]](https://resources.jetbrains.com.cn/help/img/rider/2025.2/unreferenced_parameter.png)
添加到捕获列表
如果局部变量在 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 允许您快速修复返回类型:

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

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

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

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

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

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

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

将点 (.) 替换为箭头 (->),反之亦然
如果点运算符 。 错误地应用于指针,JetBrains Rider 会帮助您将其替换为箭头运算符 ->:

反向快速修复也可用:

在 lambda 中使用显式模板形参
JetBrains Rider 检测到 lambda 可以重写为使用新的 C++20 模板语法:

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

使用 static_cast
JetBrains Rider 检测到应该优先使用 static_cast 的情况,并帮助您更新代码:
使用函数式风格的强制类型转换代替 C++ 类型转换:

在将类型转换为
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::format]]](https://resources.jetbrains.com.cn/help/img/rider/2025.2/format_attribute.png)
[[jetbrains::pass_by_value]] 属性允许您抑制“按 const 引用传递值”检查。 为什么使用抑制属性而不是通过注释禁用检查? 当您不希望看到特定类或结构的警告时,您始终可以从
Alt+Enter
菜单中选择 ,以添加注释来抑制当前行或文件中的检查。 然后,您将不得不为所有类的使用添加抑制注释。 在这些情况下,在类声明中一次性指定抑制属性要容易得多。
![[[jetbrains::pass_by_value]] [[jetbrains::pass_by_value]]](https://resources.jetbrains.com.cn/help/img/rider/2025.2/pass_by_value_attribute.png)
[[jetbrains::guard]] 属性可用于抑制“局部变量从未使用”检查。 使用此属性标记一个类,以便 JetBrains Rider 知道该类在其构造函数中执行了重要工作。
[[jetbrains::has_side_effects]] 属性允许您将 运算符= 标记为具有副作用,以抑制“分配的值从未使用”检查。
如果您需要将 JetBrains Rider 属性应用于外部库中的库类,可以在前置类声明中使用该属性: class [[jetbrains::pass_by_value]] my_class;。
如果您的编译器显示关于未知属性的警告,您可以使用 __JETBRAINS_IDE__ 或 __RESHARPER__ 宏来保护声明:
让 JetBrains Rider 忽略特定代码
为了从代码分析、导航和其他功能中排除解决方案代码的部分内容,JetBrains Rider 允许您以不同方式 忽略特定文件、文件夹和文件掩码。