常见问题
- 如何让IntelliSense正常工作?
- c_cpp_properties.json 中 includePath 和 browse.path 有什么区别?
- 为什么我在标准库类型下看到红色波浪线?
- 如何在Windows上让新的IntelliSense与MinGW一起工作?
- 如何让新的IntelliSense与Windows子系统Linux一起工作?
- 为什么我的文件在格式化时损坏了?
- 如何重新创建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
指令,它将不会显示源文件主体的linting信息。如果您检查VS Code中的问题窗口,扩展将提供更多关于无法定位的文件的信息。如果您仍然希望显示linting信息,可以更改C_Cpp.errorSquiggles
设置的值。
includePath 和 browse.path 之间有什么区别?
这两个设置在c_cpp_properties.json
中可用,可能会让人感到困惑。
includePath
这个路径字符串数组由“默认”IntelliSense引擎使用,该引擎提供语义感知的IntelliSense功能。包含路径与您通过-I
开关发送给编译器的路径相同。当您的源文件被解析时,IntelliSense引擎将在尝试解析它们时将这些路径添加到由您的#include指令指定的文件前。这些路径不会递归搜索,除非它们以/**
结尾。
浏览路径
这个路径字符串数组由“标签解析器”(“浏览引擎”)使用,该引擎用全局符号信息填充数据库。这个引擎将递归地枚举指定路径下的所有文件,并在标签解析项目文件夹时将它们作为潜在的包含文件进行跟踪。要禁用路径的递归枚举,可以在路径字符串后附加/*
。
当你第一次打开工作区时,扩展会将${workspaceFolder}/**
添加到includePath
中,而browse.path
则保持未定义状态(因此它默认为includePath
)。如果这是不希望的,你可以打开你的c_cpp_properties.json文件并进行更改。
为什么我在标准库类型下看到红色波浪线?
最常见的原因是缺少包含路径和定义。修复此问题的最简单方法是在c_cpp_properties.json中将compilerPath
设置为编译器的路径。
如何在Windows上让新的IntelliSense与MinGW一起工作?
参见 在 Visual Studio Code 中使用 C++ 和 Mingw-w64 入门。
如何让新的IntelliSense与Windows子系统Linux一起工作?
参见 在 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提供的位置不够明确,我们不想在用户可能看不到或不知道如何找到的地方写入大量的文件。
考虑到这一点,我们知道我们无法满足每个不同开发环境的需求,因此我们提供了设置,允许您根据您的情况自定义最佳工作方式。
"C_Cpp.intelliSenseCachePath":
此设置允许您为缓存路径设置工作区或全局覆盖。例如,如果您希望为所有工作区文件夹共享一个缓存位置,请打开VS Code设置,并为IntelliSense缓存路径添加用户设置。
"C_Cpp.intelliSenseCacheSize":
此设置允许您限制扩展程序的缓存量。这是一个近似值,但扩展程序将尽力使缓存大小尽可能接近您设置的限制。如果您如上所述在多个工作区之间共享缓存位置,您仍然可以增加/减少限制,但您应确保为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 discussions上发起讨论,或者如果您发现需要修复的问题,请在GitHub issues上提交问题。
如果您遇到的问题我们无法根据您的问题报告中的信息进行诊断,我们可能会要求您启用调试日志记录并发送日志给我们。请参阅C/C++扩展日志记录了解如何获取C/C++扩展日志。