在 Visual Studio 中配置 C/C++ Include 清理

从 17.8 预览版 1 开始,Visual Studio 可以通过以下方式清理 #include,以提高 C 和 C++ 代码的质量:

  • 为仅因为所需头文件被另一个头文件间接包含而编译的代码主动添加头文件。
  • 主动移除未使用的头文件 - 改进生成时间。

本文介绍如何在 Visual Studio 中配置 Include 清理。 有关 Include 清理的详细信息,请参阅 C/C++ Include 清理概述

启用 Include 清理

默认情况下,Include 清理功能处于打开状态。 如果它未处于活动状态,则可以通过“工具”>“选项”>“文本编辑器”>“C/C++”>“代码清理”启用它,然后选择“启用 #include 清理”。

然后,使用下拉列表配置你希望获得有关添加间接标头或移除未使用标头的机会的通知方式:

“工具选项”对话框在文本编辑器 > C/C++ > 代码清理中打开。

选中“启用 # Include 清理”复选框。 将显示“移除未使用包括建议级别”和“添加缺失包括建议级别”下拉列表。 将显示下拉列表的内容,其中包括:“仅重构”、“建议”、“警告”和“错误”。 **移除未使用包括建议级别** 下拉列表提供相同的选项,但还会添加灰显。

建议级别选项的含义如下:

仅重构:Include 清理提供了在将鼠标指针悬停在某个 #include 上或将光标置于 #include 行上并按 Ctrl+句点时,可以通过快速操作菜单执行的操作:

删除未使用的标头的快速操作的屏幕截图

如果将光标悬停在 # include iostream 上,将会显示一个灯泡,其文本内容为“此文件未使用 # include iostream。”

建议、警告、错误:Include 清理提供了可以通过“错误列表”窗口中的建议、警告或错误执行的操作。 你可以确定执行哪个操作。 在“错误列表”的以下屏幕截图中,Include 清理配置为显示未使用的头,同时显示警告。 确保在下拉列表筛选器中选择“生成 + Intellisense”,以便可以看到 Include 清理输出:

“错误列表”窗口的屏幕截图。

将下拉列表筛选器设置为“生成 + IntelliSense”。 将会显示警告:VCIC002 - #include < iostream > 在此文件中未使用。”

灰显

Include 清理可通过在代码编辑器中灰显未使用的头文件行来显示未使用的标头。 将光标悬停在灰显的 #include 上方以显示快速操作菜单,然后选择“显示潜在修补程序”,或单击灯泡下拉列表以查看与未使用的文件相关的操作。

#include iostream > 行灰显<的屏幕截图。

#include < iostream > 行将会灰显,因为注释掉了使用 iostream 的代码行。该代码行为 // std::cout << "charSize = " << charSize;并且会显示面向此行的快速操作菜单。 它表示此文件中未使用 #include < iostream >,并且具有“显示潜在修补程序”的链接。

使用 .editorconfig 配置 Include 清理

在配置 Include 清理时,可以使用更多选项,例如从清理建议中排除指定的包括,指示需要某些头文件,以便工具不会将它们标记为未使用等。 这些选项在 .editorconfig 文件中定义,你可以将其添加到项目中,以便针对在代码库中工作的所有人强制实施一致的编码样式。 有关将 .editorconfig 文件添加到项目的详细信息,请参阅使用 EditorConfig 创建可移植的自定义编辑器设置

可用于 Include 清理的 .editorconfig 设置包括:

设置 示例
cpp_include_cleanup_add_missing_error_tag_type

设置添加可传递包含消息的错误级别。
none
suggestion
warning
error
cpp_include_cleanup_add_missing_error_tag_type = suggestion
cpp_include_cleanup_remove_unused_error_tag_type

设置移除未使用的包含消息的错误级别。
none
suggestion
warning
error
dimmed
cpp_include_cleanup_remove_unused_error_tag_type = dimmed
cpp_include_cleanup_excluded_files

从 Include 清理消息中排除指定的文件。 你根本不会收到与头相关的建议,无论是添加头还是未使用头。
filename cpp_include_cleanup_excluded_files = vcruntime.h, vcruntime_string.h
cpp_include_cleanup_required_files

指定 file1 的使用需要 file2。 例如,指定如果使用 atlwin.h,则还必须包含 altbase.h
file1file2 cpp_include_cleanup_required_files = atlwin.h:altbase.h, atlcom.h:altbase.h
cpp_include_cleanup_replacement_files

在 Include 清理处理期间将 file1 替换为 file2。 例如,你可能更喜欢使用 cstdio 而不是 stdio.h。 如果你的一个文件同时包含 #include <cstdio>#include <stdio.h>,并且你只使用 stdio.h 的内容,但此设置 Include 清理将告诉你移除 stdio.h,因为它已在处理期间将 cstdio 替换为 stdio.h。 如果不使用任一内容,则 Include 清理将告诉你移除这两者。
file1file2 cpp_include_cleanup_replacement_files = stdio.h:cstdio,stdint.h:cstdint
cpp_include_cleanup_alternate_files

如果已包含 file1,请不要生成间接包含 file2 的消息。 例如,如果你 #include <windows.h> 并且只使用其间接包含的头 winerror.h 中的某些内容,则 Include 清理将不会提示添加 winerror.h。 当你希望包含外观头文件而不是它包含的间接包含时,这会非常有用。
file1file2 cpp_include_cleanup_alternate_files = windows.h:winerror.h, windows.h:minwindef.h

另请参阅

C/C++ Include 清理概述
Include 清理消息