常见问题
- 如何让 IntelliSense 正常工作?
- c_cpp_properties.json 中的 includePath 和 browse.path 有什么区别?
- 为什么标准库类型下方会出现红色波浪线?
- 如何让新的 IntelliSense 在 Windows 上与 MinGW 配合使用?
- 如何让新的 IntelliSense 与适用于 Linux 的 Windows 子系统 (WSL) 配合使用?
- 为什么我的文件在格式化后损坏了?
- 如何重新创建 IntelliSense 数据库?
- 什么是 ipch 文件夹?
- 如何禁用 IntelliSense 缓存 (ipch)?
- 如何设置调试?
- 如何启用调试符号?
- 为什么调试无法正常工作?
- 如果我怀疑是 C/C++ 扩展出现问题,该怎么办?
如何让 IntelliSense 正常工作?
在没有任何配置的情况下,该扩展将尝试通过搜索你的工作区文件夹以及模拟计算机上找到的编译器来定位头文件(例如,Windows 上的 cl.exe/MinGW,macOS/Linux 上的 gcc/clang)。如果此自动配置不够用,你可以通过运行 C/C++: Edit Configurations (UI) 命令来修改默认设置。在该视图中,你可以更改要模拟的编译器、要使用的包含文件路径、预处理器定义等。
或者,如果你安装了与我们的扩展进行交互的构建系统扩展,你可以让该扩展为你提供配置。例如,CMake Tools 扩展可以配置使用 CMake 构建系统的项目。使用 C/C++: Change Configuration Provider... 命令可启用此类扩展为 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 设置为你的编译器路径。
如何让新的 IntelliSense 在 Windows 上与 MinGW 配合使用?
请参阅 在 Visual Studio Code 中开始使用 C++ 和 Mingw-w64。
如何让新的 IntelliSense 与适用于 Linux 的 Windows 子系统 (WSL) 配合使用?
请参阅 在 Visual Studio Code 中开始使用 C++ 和适用于 Linux 的 Windows 子系统。
为什么我的文件在格式化后损坏了?
如果通过带有符号链接的路径打开工作区文件夹,则文件可能会损坏(并且其他功能可能会失败)(issue vscode-cpptools#5061)。解决方法是使用已将符号链接解析为其目标路径的路径来打开工作区文件夹。
如何重新创建 IntelliSense 数据库?
从扩展的 0.12.3 版本开始,提供了一个用于重置 IntelliSense 数据库的命令。打开命令面板(⇧⌘P (Windows, Linux Ctrl+Shift+P))并选择 C/C++: Reset IntelliSense Database 命令。
什么是 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")。如果你发现磁盘写入过多(尤其是在编辑头文件时),禁用缓存也可能会有所帮助。
如何设置调试?
需要配置调试器以知道要使用哪个可执行文件和调试器
从主菜单中,选择 运行 (Run) > 添加配置... (Add Configuration...)。
此时文件 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 中提交 issue。
如果你遇到的扩展问题无法根据你的 issue 报告中的信息进行诊断,我们可能会要求你启用调试日志并向我们发送日志。有关如何获取 C/C++ 扩展日志的信息,请参阅 C/C++ 扩展日志记录。