常见问题
- 如何使 IntelliSense 正确工作?
- 在 c_cpp_properties.json 中,includePath 和 browse.path 有什么区别?
- 为什么我在标准库类型下看到红色波浪线?
- 如何在 Windows 上使新的 IntelliSense 与 MinGW 配合使用?
- 如何在 Windows Subsystem for Linux 上使新的 IntelliSense 配合使用?
- 为什么我的文件在格式化时损坏?
- 如何重新创建 IntelliSense 数据库?
- 什么是 ipch 文件夹?
- 如何禁用 IntelliSense 缓存 (ipch)?
- 如何设置调试?
- 如何启用调试符号?
- 为什么调试不起作用?
- 如果我怀疑 C/C++ 扩展出现问题,该怎么办?
如何使 IntelliSense 正确工作?
在没有任何配置的情况下,扩展将尝试通过搜索工作区文件夹并模拟在您的计算机上找到的编译器来定位标头。(例如,Windows 上的 cl.exe/MinGW、macOS/Linux 上的 gcc/clang)。如果此自动配置不足,您可以通过运行**C/C++: 编辑配置 (UI)**命令来修改默认值。在该视图中,您可以更改要模拟的编译器、要使用的包含文件路径、预处理器定义等等。
或者,如果您安装了与我们的扩展交互的构建系统扩展,则可以允许该扩展为您提供配置。例如,CMake Tools 扩展可以配置使用 CMake 构建系统的项目。使用**C/C++: 更改配置提供程序...**命令启用任何此类扩展来提供 IntelliSense 配置。
对于没有构建系统扩展支持的项目,第三种选择是使用compile_commands.json文件(如果您的构建系统支持生成此文件)。在配置 UI 的“高级”部分,您可以提供compile_commands.json
的路径,扩展将使用该文件中列出的编译信息来配置 IntelliSense。
注意:如果扩展无法解析源代码中的任何#include
指令,则它不会显示源文件正文的代码风格检查信息。如果您检查 VS Code 中的**问题**窗口,扩展将提供有关无法定位哪些文件的更多信息。如果您仍然想要显示代码风格检查信息,则可以更改C_Cpp.errorSquiggles
设置的值。
includePath 和 browse.path 有什么区别?
这两个设置在c_cpp_properties.json
中可用,并且可能令人困惑。
includePath
此路径字符串数组由“默认”IntelliSense 引擎使用,该引擎提供语义感知的 IntelliSense 功能。包含路径与您通过-I
开关发送给编译器的路径相同。当解析源文件时,IntelliSense 引擎将在尝试解析这些文件时将这些路径附加到#include
指令指定的路径。除非以/**
结尾,否则不会递归搜索这些路径。
browse.path
此路径字符串数组由“标记解析器”(“浏览引擎”)使用,该引擎使用全局符号信息填充数据库。该引擎将递归枚举指定的路径下的所有文件,并将它们跟踪为标记解析项目文件夹时的潜在包含项。要禁用路径的递归枚举,可以在路径字符串中附加/*
。
当您第一次打开工作区时,扩展会将${workspaceFolder}/**
添加到includePath
,并且browse.path
保持未定义(因此它默认为includePath
)。如果这是不可取的,您可以打开您的c_cpp_properties.json文件并进行更改。
为什么我在标准库类型下看到红色波浪线?
最常见的原因是缺少包含路径和定义。修复此问题的最简单方法是在c_cpp_properties.json中将compilerPath
设置为编译器路径。
如何在 Windows 上使新的 IntelliSense 与 MinGW 配合使用?
请参阅在 Visual Studio Code 中使用 C++ 和 Mingw-w64 入门.
如何在 Windows Subsystem for Linux 上使新的 IntelliSense 配合使用?
请参阅在 Visual Studio Code 中使用 C++ 和 Windows Subsystem for Linux 入门.
为什么我的文件在格式化时损坏?
如果通过具有符号链接的路径打开工作区文件夹,则文件可能会损坏(以及其他功能可能会失败)(问题vscode-cpptools#5061)。解决方法是使用已将符号链接解析为其目标的路径打开工作区文件夹。
如何重新创建 IntelliSense 数据库?
从扩展的 0.12.3 版本开始,有一个命令可以重置您的 IntelliSense 数据库。打开命令面板(⇧⌘P(Windows、Linux Ctrl+Shift+P)),然后选择**C/C++: 重置 IntelliSense 数据库**命令。
什么是 ipch 文件夹?
语言服务器缓存有关包含头文件的信息以提高 IntelliSense 的性能。当您在工作区文件夹中编辑 C/C++ 文件时,语言服务器将把缓存文件存储在ipch
文件夹中。默认情况下,ipch
文件夹存储在用户目录下。具体来说,它存储在 Windows 上的%LocalAppData%/Microsoft/vscode-cpptools
、Linux 上的$XDG_CACHE_HOME/vscode-cpptools/
(如果未定义XDG_CACHE_HOME
,则为$HOME/.cache/vscode-cpptools/
)和 macOS 上的$HOME/Library/Caches/vscode-cpptools/
。通过将用户目录用作默认路径,它将为每个用户创建一个扩展的缓存位置。由于缓存大小限制适用于缓存位置,因此每个用户都有一个缓存位置会将缓存的磁盘空间使用量限制为使用默认设置值的每个人对应的一个文件夹。
未使用 VS Code 的每个工作区存储文件夹,因为 VS Code 提供的位置不太清楚,我们不想将 GB 的文件写入用户可能看不到或不知道在哪里找到的位置。
考虑到这一点,我们知道我们无法满足每种不同开发环境的需求,因此我们提供了设置以允许您自定义最适合您情况的方式。
"C_Cpp.intelliSenseCachePath": <string>
此设置允许您为缓存路径设置工作区或全局覆盖。例如,如果您想共享所有工作区文件夹的单个缓存位置,请打开 VS Code 设置,并为**IntelliSense 缓存路径**添加用户设置。
"C_Cpp.intelliSenseCacheSize": <number>
此设置允许您设置扩展执行缓存的量的限制。这是一个近似值,但扩展将尽最大努力将缓存大小保持尽可能接近您设置的限制。如果您如上所述跨工作区共享缓存位置,您仍然可以增加/减少限制,但您应该确保为**IntelliSense 缓存大小**添加用户设置。
如何禁用 IntelliSense 缓存 (ipch)?
如果您不想使用 IntelliSense 缓存功能(例如,解决可能仅在启用缓存时发生的错误),则可以通过将**IntelliSense 缓存大小**设置为 0 来禁用该功能(或在 JSON 设置编辑器中使用"C_Cpp.intelliSenseCacheSize": 0"
)。如果您看到过多的磁盘写入,尤其是在编辑头文件时,禁用缓存可能也有益。
如何设置调试?
调试器需要进行配置,以了解要使用哪个可执行文件和调试器。
从主菜单中,选择**运行**>**添加配置...**。
现在将打开launch.json
文件进行编辑,其中包含新的配置。默认设置可能能正常工作,但您需要指定program
设置。
请参见配置 C/C++ 调试,了解有关如何配置调试器的更深入文档。
如何启用调试符号?
启用调试符号取决于您使用的编译器类型。以下是部分编译器及其启用调试符号所需的编译器选项。
如有疑问,请查看编译器文档以了解在输出中包含调试符号所需的选项。这可能是 -g
或 --debug
的某些变体。
Clang (C++)
- 如果您手动调用编译器,请添加
--debug
选项。 - 如果您使用的是脚本,请确保已设置
CXXFLAGS
环境变量。例如,export CXXFLAGS="${CXXFLAGS} --debug"
。 - 如果您使用的是 CMake,请确保已设置
CMAKE_CXX_FLAGS
。例如,export CMAKE_CXX_FLAGS=${CXXFLAGS}
。
Clang (C)
请参见 Clang C++,但使用CFLAGS
代替CXXFLAGS
。
gcc 或 g++
如果您手动调用编译器,请添加-g
选项。
cl.exe
符号位于*.pdb
文件中。
为什么调试不起作用?
我的断点没有被命中
当您开始调试时,如果您的断点没有绑定(实心红色圆圈)或没有被命中,则可能需要在编译期间启用调试符号。
调试开始,但我的堆栈跟踪中的所有行都是灰色的
如果您的调试器显示灰色堆栈跟踪,不会在断点处停止,或者调用堆栈中的符号为灰色,则您的可执行文件是在没有调试符号的情况下编译的。
如果我怀疑 C/C++ 扩展出现问题,该怎么办?
如果您有任何其他问题,请在GitHub 讨论区发起讨论,或者如果您发现需要修复的问题,请在GitHub 问题区提交问题。
如果您遇到扩展程序问题,我们无法根据您的问题报告中的信息进行诊断,我们可能会要求您启用调试日志并发送您的日志。请参阅C/C++ 扩展日志记录,了解如何获取 C/C++ 扩展日志。