常见问题
- 如何让 IntelliSense 正常工作?
- c_cpp_properties.json 中的 includePath 和 browse.path 有什么区别?
- 为什么在标准库类型下看到红色波浪线?
- 如何让新的 IntelliSense 在 Windows 上的 MinGW 中工作?
- 如何让新的 IntelliSense 在 Windows Subsystem for 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
指令,它将不会显示源代码文件主体的代码检查信息。如果你检查 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 在 Windows Subsystem for 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 提供的这个位置不太为人所知,而且我们不想将 GB 量级的文件写入用户可能看不到或不知道去哪里找的位置。
考虑到这一点,我们知道我们无法满足所有不同开发环境的需求,因此我们提供了设置,让你能够根据自己的情况自定义最适合的方式。
"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 讨论区开始讨论,或者如果您发现需要修复的问题,请在 GitHub Issues中提交问题。
如果您遇到的扩展问题我们无法根据您的 Issue 报告中的信息进行诊断,我们可能会请您启用调试日志并将日志发送给我们。有关如何获取 C/C++ 扩展日志,请参阅C/C++ 扩展日志记录。