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