在某些情况下,可能需要手动配置C++项目,使 IntelliSense 正常工作。 对于 MSBuild 项目(基于 .vcxproj
文件),可以调整项目属性中的设置。 对于非 MSBuild 项目,可以在项目根目录中的CppProperties.json
文件中调整设置。 在某些情况下,可能需要创建提示文件来帮助 IntelliSense 了解宏定义。 Visual Studio IDE 可帮助你识别和修复 IntelliSense 问题。
单个文件 IntelliSense
如果你打开项目中没有的文件,Visual Studio 会提供一些 IntelliSense 支持,但默认不会显示任何错误波形曲线。 如果导航栏显示“杂项文件”,则可能说明为什么在不正确的代码下看不到错误波浪线,或者为什么未定义预处理器宏。
检查错误列表
如果文件未在单文件模式下打开,并且 IntelliSense 无法正常工作,则检查的第一个位置是 “错误列表 ”窗口。 若要查看当前源文件的所有 IntelliSense 错误以及所有包含的头文件,请在下拉列表中选择 Build + IntelliSense:
IntelliSense 最多生成 1,000 个错误。 如果源文件包含的头文件中的错误超过 1,000 个,则源文件开头仅显示一条错误波形曲线。
确保 #include 路径正确
MSBuild 项目
如果您在 Visual Studio IDE 外部进行构建,并且构建成功但 IntelliSense 显示不正确,则很可能是您的命令行与一个或多个配置的项目设置不同步。 右键单击解决方案资源管理器 中的项目节点,并确保所有 #include 路径都适用于当前配置和平台。 如果所有配置和平台中的路径相同,可以选择 所有配置,所有平台,然后验证路径是否正确。
若要查看生成宏(如 VC_IncludePath)的当前值,请选择“ 包含目录 ”下拉列表。 然后选择 <编辑>,选择“宏”按钮。
Makefile项目
对于基于 NMake 项目模板的 Makefile 项目,请在“配置属性”下选择“NMake”,然后在 IntelliSense 类别中选择“包括搜索路径”:
CMake 项目
对于 CMake 项目,请确保为所有 CMakeLists.txt
配置正确指定 #include 路径。 其他项目类型可能需要文件 CppProperties.json
。 有关详细信息,请参阅 使用 CppProperties.json配置代码导航 。 请确保路径对于文件中定义的每个配置都是正确的。
如果文件中出现语法错误 CppProperties.json
,受影响文件中的 IntelliSense 不正确。 Visual Studio 在输出窗口中显示错误。
标记分析器问题
标记分析器是用于浏览和导航的 模糊 C++分析器。 它是快速的,但不试图完全理解每个代码构造。
例如,它不评估预处理器宏,因此它可能会错误地分析使用它们的代码。 当标记分析器遇到不熟悉的代码构造时,它可能会跳过整个代码区域。
在 Visual Studio 中,此问题有两种常见的表现方式:
IDE 提供为已定义的函数创建函数定义。
如果导航栏显示最内部的宏,则跳过当前函数定义:
代码片段显示函数 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 pull
或 git 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++项目相关。