无论是使用向导创建新的(或修改现有的)C++项目,还是从另一个IDE导入VisualStudio中的项目,重要的是要为智能感知和浏览功能正确配置项目,以提供准确的信息。 本文提供了一些有关配置项目的提示,并介绍了一些可以调查配置问题的方法。
包括路径和预处理器宏
对IntelliSense和浏览操作的准确性影响最大的两个设置是Include路径和预处理器宏。 这对于在visualstudio之外构建的项目尤其重要:这样的项目可以在没有任何错误的情况下构建,但是在visualstudioide中显示波形。
要检查项目的配置,请打开项目的属性。 默认情况下,将选择所有配置和所有平台,以便将更改应用于所有生成配置:
如果某些配置的值与其他配置的值不同,那么您将看到 <不同选项> . 如果您的项目是Makefile项目,那么您将看到以下属性对话框。在这种情况下,控制IntelliSense和浏览的设置将位于NMake属性页的IntelliSense类别下:
错误列表
如果IntelliSense显示的信息不正确(或根本无法显示任何内容),则首先要检查的是错误列表窗口。 早期的错误可能会阻止IntelliSense正常工作。 要查看当前源文件的所有错误以及包含的所有头文件,请通过在下拉列表中进行以下选择,启用在错误列表窗口中显示IntelliSense错误:
IntelliSense将其产生的错误数限制为1000个。如果源文件包含的头文件中的错误超过1000个,则源文件将仅在源文件的最开始处显示一个错误波形。
通过诊断日志验证项目设置
为了检查智能感知编译器是否使用正确的编译器选项,包括包含路径和预处理器宏,在工具>选项>文本编辑器> C/C++ >高级>诊断日志中打开智能日志命令行的诊断日志记录。将“启用日志记录”设置为True,将“日志记录级别”设置为5(最详细),将“日志记录筛选器”设置为8(IntelliSense日志记录):
输出窗口现在将显示传递给IntelliSense编译器的命令行。以下是您可能看到的示例输出:
[IntelliSense] Configuration Name: Debug|Win32 [IntelliSense] Toolset IntelliSense Identifier: [IntelliSense] command line options: /c /I. /IC:RepoIncludes /DWIN32 /DDEBUG /D_DEBUG /Zc:wchar_t- /Zc:forScope /Yustdafx.h
这些信息可能有助于理解IntelliSense提供不准确信息的原因。一个例子是未估价的项目财产。如果项目的Include目录包含$(MyVariable)Include,并且诊断日志将/IInclude显示为Include路径,则表示$(MyVariable)未计算,已从最终Include路径中删除。
智能感知构建
为了评估IntelliSense编译器使用的命令行,visualstudio启动解决方案中每个项目的IntelliSense-only构建。MSBuild执行与项目生成相同的步骤,但没有执行任何生成命令:它只收集完整的命令行。
如果您的项目包含一些自定义的.props或.targets文件,则仅IntelliSense生成可能在完成命令行计算之前失败。从Visual Studio 2017 15.6开始,仅IntelliSense生成的错误将记录到“输出”窗口的“解决方案”窗格中。
An example error you may see is: error: Designtime build failed for project 'E:srcMyProjectMyProject.vcxproj', configuration 'Debug|x64'. IntelliSense might be unavailable. Set environment variable TRACEDESIGNTIME=true and restart Visual Studio to investigate.
如果将环境变量TRACEDESIGNTIME设置为true并重新启动Visual Studio,您将在%%TEMP%%目录中看到一个日志文件,它将帮助诊断此错误:
C:UsersmeAppDataLocalTempMyProject.designtime.log : error : Designtime build failed for project 'E:srcMyProjectMyProject.vcxproj', configuration 'Debug|x64'. IntelliSense might be unavailable.
要了解有关TRACEDESIGNTIME环境变量的更多信息,请参阅 罗斯林 和 通用工程系统 项目。C++项目系统是基于通用项目系统的,所以文章中的信息适用于所有C++项目。
单文件智能感知
VisualStudio允许您利用IntelliSense和对不属于任何现有项目的文件的浏览支持。默认情况下,在此模式下打开的文件不会显示任何错误波形,但仍将提供IntelliSense;因此,如果在不正确的代码下没有看到任何错误,或者如果没有定义某些预期的预处理器宏,请检查文件是否以单文件模式打开。为此,请查看导航栏中的“项目”节点:项目名称将是杂项文件:
调查打开的文件夹问题
Open Folder是Visual Studio 2017中的一个新命令,允许您打开不包含Visual Studio识别的任何项目或解决方案文件的源文件集合。为了帮助配置IntelliSense和浏览在此模式下打开的代码,我们引入了一个配置文件CppProperties.json。请参阅 这篇文章 更多信息。
CppProperties.json语法错误
如果错误地将语法错误引入CppProperties.json文件,则受影响文件中的IntelliSense将不正确。VisualStudio将在输出窗口中显示错误,因此请确保选中该窗口。
项目配置
在打开文件夹模式下,可以使用“项目配置”工具栏选择不同的配置。
请注意,如果多个CppProperties.json文件提供不同名称的配置,则所选配置可能不适用于当前打开的源文件。要检查正在使用的配置,请打开诊断日志以检查IntelliSense开关。
单文件智能感知
当解决方案打开时,VisualStudio将使用单文件模式为不属于解决方案的文件提供IntelliSense。 类似地,在打开文件夹模式下,将对目录范围之外的所有文件使用单文件IntelliSense。 检查导航栏中的项目名称,查看是否使用单文件模式而不是CppProperties.json来为源代码提供IntelliSense。
调查标记解析器问题
标签分析器是C++的“模糊”解析器,用于浏览和导航。 (请退房 此博客帖子 更多信息。)
因为标记解析器不计算预处理器宏,所以在解析大量使用它们的代码时可能会出错。当标签解析器遇到不熟悉的代码结构时,它可能会跳过一大块代码。
这个问题在visualstudio中有两种常见的表现方式。第一种方法是影响导航栏中显示的结果。如果导航栏显示的不是封闭函数,而是最内部的宏,则跳过当前函数定义:
问题的第二种表现方式是显示为已定义的函数创建函数定义的建议:
为了帮助解析器理解宏的内容,我们引入了提示文件的概念(请看 文件 将一个名为cpp.hint的文件放到解决方案目录的根目录中,向其中添加所有更改预处理器定义的代码(即#define do_if(condition)if(condition)),并调用Rescan solution命令,如下所示,以帮助标记解析器正确理解代码。
即将到来:标记解析器错误将开始出现在错误列表窗口中。敬请期待!
正在扫描库更新
VisualStudio定期检查解决方案中的文件是否已被其他程序更改。 例如,当“git pull”或“git checkout”命令完成时,VisualStudio可能需要一个小时才能意识到任何新文件并开始提供最新信息。 要强制重新扫描解决方案中的所有文件,请选择 重新扫描解决方案 上下文菜单中的命令:
这个 重新扫描文件 在上面的屏幕截图中看到的命令应该被用作最后的诊断步骤。 在极少数情况下,IntelliSense引擎会失去对更改的跟踪并停止提供正确的信息 重新扫描文件 命令将重新启动当前文件的引擎。
给我们反馈!
我们希望这些起点能够帮助您诊断在使用VisualStudio进行IntelliSense和浏览操作时遇到的任何问题。对于您发现的所有问题,请使用“帮助”>“发送反馈”>“报告问题”命令进行报告。所有报告的问题都可以在 开发者社区 .