C++ 中的代码分析
ReSharper 的代码分析关键功能也支持 C++。 您可以在 代码分析 部分的相应主题中找到关于这些功能的详细信息。 在该部分的主要主题中,您还可以找到功能矩阵并检查 C++ 中具体支持的内容。
在本主题中,您可以找到一些使用 C++ 代码分析功能的示例。
默认情况下, 代码检查、 快速修复和 上下文操作 在所有解决方案文件中可用。 If necessary, you can enable these features in external files referenced from the solution with the 启用检查、快速修复和上下文操作,以解决方案外部的文件 checkbox on the page of ReSharper 选项 Alt+R, O .
代码检查
ReSharper 的静态代码分析可以检测到 C++ 文件中的大多数编译器错误和一些编译器警告。
此外,它还会发现其他代码问题,这些问题通常会在运行时被发现。 例如,在构造函数中使用虚方法会导致意外行为,如 此 StackOverflow 问题 中所述。 ReSharper 在您编译之前就指出了这个问题:

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

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

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

您可以在 ReSharper 选项 Alt+R, O 页面的 上使用 显示导入操作的弹出窗口 复选框来禁用弹出窗口。
如果未选中复选框,则在按下 Alt+Enter 时,相应的操作将会在 操作列表中可用。
添加前向声明
ReSharper 还可以为未解析的符号生成前向声明:

添加 [[maybe_unused]]
可以添加 [[maybe_unused]] 属性以避免编译器关于未使用名称或实体的警告。 当光标位于未使用的实体上时,将提供以下快速修复:
![添加 [[maybe_unused]]](https://resources.jetbrains.com.cn/help/img/dotnet/2025.2/maybe_unused_attr.png)
另一个上下文操作将帮助您将 UNREFERENCED_PARAMETER 和 Q_UNUSED 的用法替换为 [[maybe_unused]] 属性:
![添加 [[maybe_unused]]](https://resources.jetbrains.com.cn/help/img/dotnet/2025.2/unreferenced_parameter.png)
添加到捕获列表
如果局部变量在 lambda 主体中使用但未被该 lambda 捕获,ReSharper 会建议快速修复以更新捕获列表。 You can capture the variable or this by value, by reference, or implicitly capture all the used automatic variables:

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

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

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

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

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

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

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

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

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

反向快速修复也可用:

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

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

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

reinterpret_cast用于替代static_cast在转换为void*时:
使用属性优化检查
您可以为源代码中的符号添加特定于 ReSharper 的属性,以使 ReSharper 更准确和深入地分析您的解决方案。 ReSharper 允许您使用以下自定义属性: [[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/dotnet/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/dotnet/2025.2/pass_by_value_attribute.png)
[[jetbrains::guard]] 属性可用于抑制“局部变量从未使用”检查。 使用此属性标记一个类,以便 ReSharper 知道该类在其构造函数中执行了重要工作。
[[jetbrains::has_side_effects]] 属性允许您将 operator= 标记为具有副作用,以抑制“赋值值从未使用”检查。
如果您需要将 ReSharper 属性应用于外部库中的库类,可以在前向类声明中使用该属性: class [[jetbrains::pass_by_value]] my_class;。
如果您的编译器显示关于未知属性的警告,您可以使用 __JETBRAINS_IDE__ 或 __RESHARPER__ 宏来保护声明:
使 ReSharper 忽略特定代码
要将解决方案代码的部分内容从代码分析、导航和其他功能中排除,ReSharper 允许您以不同方式 忽略特定文件、文件夹和文件掩码。