为 IntelliSense 配置C++项目

在某些情况下,可能需要手动配置C++项目,使 IntelliSense 正常工作。 对于 MSBuild 项目(基于 .vcxproj 文件),可以调整项目属性中的设置。 对于非 MSBuild 项目,可以在项目根目录中的CppProperties.json文件中调整设置。 在某些情况下,可能需要创建提示文件来帮助 IntelliSense 了解宏定义。 Visual Studio IDE 可帮助你识别和修复 IntelliSense 问题。

单个文件 IntelliSense

如果你打开项目中没有的文件,Visual Studio 会提供一些 IntelliSense 支持,但默认不会显示任何错误波形曲线。 如果导航栏显示“杂项文件”,则可能说明为什么在不正确的代码下看不到错误波浪线,或者为什么未定义预处理器宏。

检查错误列表

如果文件未在单文件模式下打开,并且 IntelliSense 无法正常工作,则检查的第一个位置是 “错误列表 ”窗口。 若要查看当前源文件的所有 IntelliSense 错误以及所有包含的头文件,请在下拉列表中选择 Build + IntelliSense

“错误列表”窗口的屏幕截图。在筛选器下拉列表中选择“生成 + IntelliSense”。

IntelliSense 最多生成 1,000 个错误。 如果源文件包含的头文件中的错误超过 1,000 个,则源文件开头仅显示一条错误波形曲线。

确保 #include 路径正确

MSBuild 项目

如果您在 Visual Studio IDE 外部进行构建,并且构建成功但 IntelliSense 显示不正确,则很可能是您的命令行与一个或多个配置的项目设置不同步。 右键单击解决方案资源管理器 中的项目节点,并确保所有 #include 路径都适用于当前配置和平台。 如果所有配置和平台中的路径相同,可以选择 所有配置所有平台,然后验证路径是否正确。

显示“配置属性”部分中的“包含目录”设置的屏幕截图。

若要查看生成宏(如 VC_IncludePath)的当前值,请选择“ 包含目录 ”下拉列表。 然后选择 <编辑>,选择“宏”按钮。

Makefile项目

对于基于 NMake 项目模板的 Makefile 项目,请在“配置属性”下选择“NMake”,然后在 IntelliSense 类别中选择“包括搜索路径”:

显示“配置属性”>“N Make”>“包含搜索路径”设置的屏幕截图。

CMake 项目

对于 CMake 项目,请确保为所有 CMakeLists.txt配置正确指定 #include 路径。 其他项目类型可能需要文件 CppProperties.json 。 有关详细信息,请参阅 使用 CppProperties.json配置代码导航 。 请确保路径对于文件中定义的每个配置都是正确的。

如果文件中出现语法错误 CppProperties.json ,受影响文件中的 IntelliSense 不正确。 Visual Studio 在输出窗口中显示错误。

标记分析器问题

标记分析器是用于浏览和导航的 模糊 C++分析器。 它是快速的,但不试图完全理解每个代码构造。

例如,它不评估预处理器宏,因此它可能会错误地分析使用它们的代码。 当标记分析器遇到不熟悉的代码构造时,它可能会跳过整个代码区域。

在 Visual Studio 中,此问题有两种常见的表现方式:

  1. IDE 提供为已定义的函数创建函数定义。

  2. 如果导航栏显示最内部的宏,则跳过当前函数定义:

    屏幕截图显示标记分析程序跳过了函数定义。

    代码片段显示函数 main 中使用的 do_if 宏定义。 标签解析器不了解宏,因此导航下拉列表不是显示当前函数名称为 main,而是显示宏的名称:do_if。

若要解决此类问题,请在解决方案目录的根目录中添加一个名为cpp.hint的文件。 有关详细信息,请参阅 提示文件

标记分析程序错误显示在 错误列表 窗口中。

使用诊断日志记录验证项目设置

若要检查 IntelliSense 编译器是否使用正确的编译器选项(包括包括路径和预处理器宏),请在 工具 > 选项 > 文本编辑器 > C/C++ > 高级 > 诊断日志记录中打开 IntelliSense 命令行的诊断日志记录。 将 启用日志记录 设置为 True、将 日志记录级别 设置为 5(最详细),并将 日志记录筛选器 设置为 8(IntelliSense 日志记录)。

输出窗口现在显示传递给 IntelliSense 编译器的命令行。 下面是示例输出:

[IntelliSense] Configuration Name: Debug|Win32
[IntelliSense] Toolset IntelliSense Identifier:
[IntelliSense] command line options:
/c
/I.
/IC:\Repo\Includes
/DWIN32
/DDEBUG
/D_DEBUG
/Zc:wchar_t-
/Zc:forScope
/Yustdafx.h

此信息可能有助于了解 IntelliSense 为何提供不准确的信息。 例如,如果项目的 Include 目录包含 $(MyVariable)\Include,并且诊断日志显示 /I\Include 为包含路径,这意味着 $(MyVariable) 未被评估,并已从最终的包含路径中删除。

关于 IntelliSense 生成

Visual Studio 使用专用C++编译器来创建和维护支持所有 IntelliSense 功能的数据库。 为了使 IntelliSense 数据库与代码保持同步,Visual Studio 会自动启动仅 IntelliSense 生成作为后台任务,以响应项目设置或源文件中所做的某些更改。

但是,在某些情况下,Visual Studio 可能无法及时更新 IntelliSense 数据库。 例如,运行 git pullgit checkout 命令时,Visual Studio 最多可能需要一小时才能检测文件中的更改。 可以通过右键单击解决方案资源管理器 中的项目 节点并选择 重新扫描解决方案来强制重新扫描解决方案中的所有文件。

排查 IntelliSense 生成失败问题

IntelliSense 生成即使不生成二进制文件,也仍可能会发生故障。 失败的一个可能原因是自定义 .props.targets 文件。 在 Visual Studio 2017 版本 15.6 及更高版本中,与 IntelliSense 相关的生成错误仅会记录到“输出”窗口中。 若要查看这些错误,请将“显示的输出来自”设置为“解决方案”

显示“输出”窗口的屏幕截图。下拉列表中的“显示输出”设置为“解决方案”。

错误消息可能会指示您启用设计时跟踪功能:

error: Designtime build failed for project 'E:\src\MyProject\MyProject.vcxproj',
configuration 'Debug|x64'. IntelliSense might be unavailable.
Set environment variable TRACEDESIGNTIME=true and restart
Visual Studio to investigate.

如果将环境变量 TRACEDESIGNTIME 设置为 true 并重启 Visual Studio,则目录中会显示日志文件 %TEMP% ,这可能有助于诊断生成失败。

若要了解有关环境变量的详细信息 TRACEDESIGNTIME ,请参阅 Roslyn设计时生成。 这些文章中的信息与C++项目相关。