ReSharper 2025.2 Help

C++ 中的代码分析

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

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

默认情况下, 代码检查快速修复上下文操作 在所有解决方案文件中可用。 If necessary, you can enable these features in external files referenced from the solution with the 启用检查、快速修复和上下文操作,以解决方案外部的文件 checkbox on the 代码编辑 | C++ | 检查 page of ReSharper 选项 Alt+R, O .

代码检查

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

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

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

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

C++ 项目中的代码检查结果

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

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

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

禁用 C++ 中的检查

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

快速修复

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

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

添加缺失的 #include 指令

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

ReSharper:帮助自动添加缺失的 C++ include

您可以在 ReSharper 选项 Alt+R, O 页面的 代码编辑 | C++ | 检查 上使用 显示导入操作的弹出窗口 复选框来禁用弹出窗口。

如果未选中复选框,则在按下 Alt+Enter 时,相应的操作将会在 操作列表中可用。

添加前向声明

ReSharper 还可以为未解析的符号生成前向声明:

ReSharper:添加前向声明快速修复

添加 [[maybe_unused]]

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

添加 [[maybe_unused]]

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

添加 [[maybe_unused]]

添加到捕获列表

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

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

更改返回值类型

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

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

更改变量类型

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

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

创建声明

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

为 C++ 类成员生成声明

从用法创建

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

从用法生成 C++ 字段

初始化成员

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

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

初始化变量

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

ReSharper 帮助初始化 C++ 中的变量

移除未使用的 #include 指令

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

移除未使用的 #include 指令

移除未使用的 lambda 捕获

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

移除未使用的 lambda 捕获

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

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

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

反向快速修复也可用:

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

在 lambda 中使用显式模板形参

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

在 lambda 中使用显式模板形参

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

完美转发语法

使用 static_cast

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

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

    使用函数式风格的转换代替 C++ 转换
  • reinterpret_cast 用于替代 static_cast 在转换为 void* 时:

    在转换为 void* 时使用 reinterpret_cast 代替 static_cast

使用属性优化检查

您可以为源代码中的符号添加特定于 ReSharper 的属性,以使 ReSharper 更准确和深入地分析您的解决方案。 ReSharper 允许您使用以下自定义属性: [[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]] 属性可用于抑制“局部变量从未使用”检查。 使用此属性标记一个类,以便 ReSharper 知道该类在其构造函数中执行了重要工作。

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

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

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" }

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

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

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

使 ReSharper 忽略特定代码

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

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