常见问题
- 如何让 IntelliSense 正常工作?
- c_cpp_properties.json 中的 includePath 和 browse.path 有什么区别?
- 为什么标准库类型下有红色波浪线?
- 如何在 Windows 上使用 MinGW 让新的 IntelliSense 正常工作?
- 如何在 Windows Subsystem for Linux (WSL) 上使用新的 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 指令,它将不会显示源代码正文的 linting 信息。如果您检查 VS Code 中的问题窗口,扩展程序将提供有关无法找到哪些文件的更多信息。如果您仍然想显示 linting 信息,可以更改 C_Cpp.errorSquiggles 设置的值。
includePath 和 browse.path 有什么区别?
这两个设置在 c_cpp_properties.json 中可用,可能会令人困惑。
includePath
这个路径字符串数组由“默认”IntelliSense 引擎使用,它提供语义感知的 IntelliSense 功能。包含路径与您将通过 -I 开关发送给编译器的路径相同。当解析您的源文件时,IntelliSense 引擎将在尝试解析 #include 指令指定的文件时将这些路径添加到它们的前面。除非这些路径以 /** 结尾,否则它们不会被递归搜索。
browse.path
这个路径字符串数组由“Tag Parser”(“浏览引擎”)使用,它用全局符号信息填充数据库。这个引擎将递归地枚举指定路径下的所有文件,并在对项目文件夹进行标签解析时将它们作为潜在的包含文件进行跟踪。要禁用路径的递归枚举,您可以在路径字符串后附加 /*。
当您第一次打开工作区时,扩展程序会将 ${workspaceFolder}/** 添加到 includePath,并且 browse.path 保持未定义(因此它默认为 includePath)。如果这是不需要的,您可以打开 c_cpp_properties.json 文件并进行更改。
为什么标准库类型下有红色波浪线?
最常见的原因是缺少包含路径和定义。最简单的解决方法是将 c_cpp_properties.json 中的 compilerPath 设置为您的编译器的路径。
如何在 Windows 上使用 MinGW 让新的 IntelliSense 正常工作?
请参阅 在 Visual Studio Code 中开始使用 C++ 和 Mingw-w64。
如何在 Windows Subsystem for Linux (WSL) 上使用新的 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 Cache Path添加用户设置。
"C_Cpp.intelliSenseCacheSize": <number>
此设置允许您限制扩展程序执行的缓存量。这是一个近似值,但扩展程序将尽最大努力使缓存大小尽可能接近您设置的限制。如果您如上所述跨工作区共享缓存位置,您仍然可以增加/减少限制,但您应该确保为IntelliSense Cache Size添加用户设置。
如何禁用 IntelliSense 缓存 (ipch)?
如果您不想使用 IntelliSense 缓存功能(例如为了解决可能仅在启用缓存时发生的错误),您可以通过将IntelliSense Cache Size设置设置为 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++ 扩展程序日志记录。