为 IntelliSense 配置C++项目

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

单个文件 IntelliSense

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

检查错误列表

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

错误列表中 “错误列表”中的 VC++ IntelliSense

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

确保 #include 路径正确

MSBuild 项目

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

VC++ Include 目录

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

生成文件项目

对于基于 NMake 项目模板的生成文件项目,依次选择左侧窗格中的“NMake”和“IntelliSense”类别下的“Include 搜索路径”

生成文件项目 Include 路径

Open Folder 项目

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

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

标记分析器问题

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

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

在 Visual Studio 中,此问题通常以两种形式表现出来:

  1. 如果导航栏中显示最内层的宏,则表示当前的函数定义已被跳过:

    标记分析程序跳过函数定义

  2. IDE 提供为已定义的函数创建函数定义:

    标记分析器建议定义现有函数

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

标记分析器错误显示在“错误列表”窗口中

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

要检查 IntelliSense 编译器使用的编译器选项(包括“Include 路径”和“预处理器宏”)是否正确,请依次转到“工具”>“选项”>“文本编辑器”>“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 环境变量的详细信息,请参阅 RoslynCommon Project System。 这些文章中的信息与C++项目相关。