本文为译文,点击 此处查看原文(2019/07/03)。
用于 Visual Studio Code
的 C/C++ 支持是由一个 Microsoft C/C++ 扩展提供的,它支持在 Windows、Linux 和 macOS 上使用 VS Code 进行跨平台的 C 和 C++ 开发。此扩展目前还是预览版,我们的重点是对任何地方运行的 VS Code,提供 C 和 C++ 代码的代码编辑、导航和调试支持。
如果你只是想要一个轻量级的工具来编辑你的 C++ 文件,Visual Studio Code 是一个很好的选择。但是,如果您希望为现有的 Visual C++ projects 提供最好的体验,或者在 Windows 上进行调试,我们建议您使用 Visual Studio IDE 的一个版本,比如 Visual Studio Community。
如果您遇到任何问题或对 Microsoft C/C++ 扩展有任何建议,请在 GitHub 上提交问题和建议。如果您还没有提供反馈,请使用这个快速调查来帮助根据您的需要构建此扩展。
1. 开始
安装 Microsoft C/C++ 扩展的步骤:
- 打开 VS Code
- 单击侧边栏上的 Extensions View 图标
- 搜索
C++
- 单击 Install,然后单击 Reload
注意:C/C++ 扩展不包含 C++ 编译器或调试器。您将需要安装这些工具或使用已经安装在您的计算机上的工具。流行的 C++ 编译器包括 Windows 上的 mingw-w64、macOS 上用于 XCode 的 Clang
和 Linux 上的 GCC。确保您的编译器可执行文件位于您的平台 path
中,以便此扩展可以找到它。此扩展还支持用于 Linux 的 Windows 子系统。
有关为特定环境配置 VS Code 的说明,请参见:
2. 编辑代码
2.1 代码格式化
用于 Visual Studio Code 的 C/C++ 扩展支持使用扩展中包含的 clang-format 对源代码进行格式化。
您可以使用 Format Document(Ctrl+Shift+I
) 对整个文件进行格式化,或者在右键单击上下文菜单中使用 Format Selection(Ctrl+K Ctrl+F
) 对当前选定的内容进行格式化。您还可以使用以下设置来配置自动格式化:
editor.formatOnSave
—— 当您保存文件时格式化。editor.formatOnType
—— 当您输入时格式化(在;
字符处触发)。
默认情况下,clang-format style
被设置为 “file”
,这意味着它将在您的工作区中查找一个 .clang-format
文件。如果找到 .clang-format
文件,则根据文件中指定的设置应用格式化。如果在您的工作区中没有找到 .clang-format
文件,则根据 C_Cpp.clang_format_fallbackStyle
设置中指定的一个默认 style 应用格式化。目前,默认格式化 style 是 “Visual Studio”
,这是 Visual Studio 中默认代码格式化程序的近似形式。
“Visual Studio” clang-format style
还不是一个正式的 OOTB clang-format style,但它包含以下 clang-format 设置:
UseTab: (VS Code current setting)
IndentWidth: (VS Code current setting)
BreakBeforeBraces: AllMan
AllowShortIfStatementsOnASingleLine: false
IndentCaseLabels: false
ColumnLimit: 0
如果您希望使用与扩展附带的 clang-format 一个不同的版本,可以使用 C_Cpp.clang_format_path
设置,并将其值设置为 clang-format
二进制文件安装的路径。
例如,在Windows平台上:
"C_Cpp.clang_format_path": "C:\\Program Files (x86)\\LLVM\\bin\\clang-format.exe"
2.2 自动完成
自动完成与 Visual Studio 使用相同的引擎。当您的工作区配置了所有必要的 include 路径和定义的时候,您将得到最相关的建议(参见上面的“配置智能感知(Configuring IntelliSense)”
一节)。
3. 导航代码
C/C++ 扩展提供的源代码导航特性是理解和处理代码库的强大工具。这些特性由存储在符号信息的离线数据库中的 tags
提供支持。在安装了 C/C++ 扩展之后,每当将包含 C++ 源代码文件的文件夹加载到VS代码中时,就会生成这个数据库。当 tag-parser
生成此信息时,数据库图标出现在活动配置名(下图中的“Win32”)旁边。
当此图标消失时,源代码符号已在脱机数据库中被标记。
3.1 指定附加 include 目录以获得更好的符号支持
为了提供最好的体验,VS Code 的 C/C++ 扩展需要知道在哪里可以找到代码中引用的每个头文件。默认情况下,此扩展搜索当前源目录、它的子目录和一些特定于平台的位置。如果一个引用的头文件没有被找到,VS Code 会在每个引用它的 #include
指令下面显示一条绿色波浪线。
如果你要指定要搜索的附加 include 目录,请将光标放在显示一条绿色波浪线的任何 #include 指令上,然后在出现时点击 lightbulb
操作。这将打开文件 c_cpp_properties.json
进行编辑;在这里,您可以通过向 'browse.path'
属性添加更多目录,来为每个平台配置单独指定附加的 include 目录。
3.2 搜索符号
您可以在当前文件或工作区中搜索符号,以更快地导航代码。
要在当前文件中搜索符号,请按 Ctrl+Shift+O
,然后输入要查找的符号的名称。当您键入时,将显示潜在匹配项的列表并进行筛选。从匹配项列表中选择要导航到其位置的项。
要在当前工作区中搜索符号,请按 Ctrl+T
,然后输入符号的名称。潜在匹配项的列表将像以前一样出现。如果您选择在尚未打开的文件中找到的匹配项,则将在导航到匹配项的位置之前打开该文件。
或者,如果您愿意,可以通过命令面板(Command Palette)
访问这些命令来搜索符号。使用 Quick Open(Ctrl+P
),然后输入 '@'
命令来搜索当前文件,或者 '#'
命令来搜索当前工作区。Ctrl+Shift+O
和 Ctrl+T
分别是 '@'
和 '#'
命令的快捷键,所以所有操作都是一样的。
3.3 Peek Definition
您可以快速查看如何使用 Peek Definition 特性定义一个符号。该特性在一个 peek 窗口中显示定义附近的几行代码,这样您就可以在不离开当前位置的情况下查看定义。
要查看符号的定义,请将光标放在源代码中使用的任何符号上,然后按 Ctrl+Shift+F10
。或者,您可以从上下文菜单中选择Peek Definition
(右键单击,然后选择Peek Definition)。
目前,C/C++ 扩展在解析代码时并没有根据符号的使用方式来帮助区分不同的定义。当符号在不同的上下文中定义不同的事物时,例如重载函数、类及其构造函数和其他情况时,就会出现这些相互冲突的定义。当这种情况发生时,peek 窗口的右边列出了每个相互竞争的定义,左边显示了当前选择的源代码。
打开 peek 窗口后,您将浏览竞争定义列表,以找到您感兴趣的定义。如果您想导航到其中一个定义的位置,只需双击感兴趣的定义,或者双击 peek 窗口左侧显示的源代码中的任何位置。
3.4 Go to Definition
还可以使用 Go to Definition
特性快速导航到符号的定义位置。
要跳转到一个符号的定义,请将光标放在源代码中使用的符号上,然后按 F12
。或者,您可以从上下文菜单中选择 Go to Definition
(右键单击,然后选择Go to Definition)。当符号只有一个定义时,您将直接导航到它的位置;否则,竞争的定义将在 peek 窗口中显示,如前一节所述,您必须选择要访问的定义。
4. 调试
在您按照 第一章:开始
时指定的方式设置调试环境的基础之后,您可以在本节中了解关于调试 C/C++ 的更多细节。
VS Code 支持以下用于 C/C++ 的调试器,这取决于您使用的操作系统:
- Linux: GDB
- macOS: LLDB 或 GDB
- Windows: Visual Studio Windows Debugger 或 GDB(使用 Cygwin 或 MinGW)
4.1 使用 GDB 在 Windows 上调试
您可以使用 VS Code 调试使用 Cygwin 或 MinGW 创建的 Windows 应用程序。要使用 Cygwin 或 MinGW 调试特性,必须在启动配置(launch.json
)中手动设置 debugger 路径。要调试 Cygwin 或 MinGW 应用程序,请添加 miDebuggerPath
属性,并将其值设置为 Cygwin 或 MinGW 环境对应的 gdb.exe
的位置。
例如:
"miDebuggerPath": "c:\\mingw\\bin\\gdb.exe"
Windows上的 Cygwin/MinGW 调试支持附加和启动调试场景。
要了解更多信息,请参见配置 launch.json 用于 C/C++ 调试。
如果在 Windows 上使用 GDB 进行调试,请参阅使用 MinGW64 进行 Windows 调试。
4.2 条件断点(Conditional Breakpoints)
条件断点使您仅在条件值为真时才能中断对一个特定代码行的执行。要设置条件断点,右键单击现有断点并选择 Edit Breakpoint
。这将打开一个小的 peek 窗口,您可以在其中输入必须计算为 true 的条件,以便在调试期间命中断点。
在此编辑器中,条件断点由一个断点符号表示,其中包含一个黑色等号。您可以将光标放在条件断点上以显示其条件。
4.3 函数断点(Function Breakpoints)
函数断点使您能够在函数的开头而不是在特定的代码行上中断执行。要设置函数断点,请在 “Debug”
窗格中右键单击 “Breakpoints”
部分,然后选择 “Add Function Breakpoint”
,并输入要在其上中断执行的函数的名称。
4.4 表达式计算(Expression Evaluation)
VS Code 支持在几种情况下的表达式计算:
- 您可以在
Debug
面板的Watch
部分中输入一个表达式,它将在每次命中断点时进行计算。 - 您可以在
Debug Console
中输入一个表达式,并且它只会被计算一次。 - 当您在断点处停止时,您可以计算代码中出现的任何表达式。
注意,Watch
部分中的表达式在被调试的应用程序中生效;修改变量值的表达式将在程序执行期间修改该变量。
4.5 多线程调试
VS Code 的 C/C++ 扩展具有调试多线程程序的能力。所有线程及其调用堆栈出现在 Call Stack
部分:
4.6 内存转储调试
VS Code 的 C/C++ 扩展还具有调试内存转储的能力。要调试内存转储,请打开您的 launch.json
文件,将coreDumpPath
(用于 GDB 或 LLDB)或 dumpPath
(用于 Visual Studio Windows Debugger)属性添加到 C++ Launch
配置中,将其值设置为包含内存转储路径的一个字符串。这甚至适用于正在 x64 机器上调试的 x86 程序。
4.7 额外的符号
如果调试器可以在其他目录中找到符号文件(例如,用于 Visual Studio Windows Debugger的 .pdb
文件),则可以通过添加 additionalSOLibSearchPath
(用于 GDB 或 LLDB)或 symbolSearchPath
(用于Visual Studio Windows Debugger)来指定它们。
例如:
"additionalSOLibSearchPath": "/path/to/symbols;/another/path/to/symbols"
或
"symbolSearchPath": "C:\\path\\to\\symbols;C:\\another\\path\\to\\symbols"
4.8 定位源文件
如果源文件不在编译位置,则可以更改源文件位置。这是通过在 sourceFileMap
部分中添加简单的替换对来完成的。将使用列表中的第一个匹配项。
例如:
"sourceFileMap": {
"/build/gcc-4.8-fNUjSI/gcc-4.8-4.8.4/build/i686-linux-gnu/libstdc++-v3/include/i686-linux-gnu": "/usr/include/i686-linux-gnu/c++/4.8",
"/build/gcc-4.8-fNUjSI/gcc-4.8-4.8.4/build/i686-linux-gnu/libstdc++-v3/include": "/usr/include/c++/4.8"
}
4.9 GDB、LLDB 和 MI 命令(GDB/LLDB)
对于 C++ (GDB/LLDB)
调试环境,可以使用 -exec
命令通过调试控制台直接执行 GDB、LLDB 和 MI 命令,但是要注意,直接在调试控制台执行命令是未经测试的,在某些情况下可能会导致 VS Code 崩溃。
4.10 其他调试功能
- 无条件的断点(Unconditional breakpoints)
- 监视窗口(Watch window)
- 调用堆栈(Call stack)
- 步进(Stepping)
有关使用 VS Code 调试的更多信息,请参见在 VS Code 中调试的介绍。
5. 已知的限制
5.1 符号和代码导航
所有平台:
- 因为扩展不解析函数体,所以 Peek Definition 和 Go to Definition 不适用于在函数体中定义的符号。
5.2 调试
Windows:
- Cygwin 和 MinGW 上的 GDB 不能中断正在运行的进程。要在应用程序运行时设置断点(不是在调试器下停止),或要暂停正在调试的应用程序,请在应用程序的终端中按
Ctrl-C
。 - Cygwin 上的 GDB 无法打开核心转储。
Linux:
GDB
需要提高附加到一个进程的权限。使用attach to process
时,需要在调试会话开始之前提供您的密码。
macOS:
- LLDB:
- 使用 LLDB 调试时,如果终端窗口在中断模式下关闭,则调试不会停止。按下
Stop
按钮即可停止调试。
当调试停止时,终端窗口未关闭。
- 使用 LLDB 调试时,如果终端窗口在中断模式下关闭,则调试不会停止。按下
- GDB:
- 要在 macOS 上使用 GDB,还需要完成其他手动安装步骤。请参阅 README 文件中的
为 OS X 手动安装 GDB
。 - 当使用 GDB 附加到一个进程时,正在调试的应用程序不能被中断。GDB 只在应用程序不运行时绑定断点集(在附加到应用程序之前,或者在应用程序处于停止状态时)。这是由于 GDB 中的一个 bug。
- 在使用 GDB 调试时无法加载核心转储,因为 GDB 不支持 macOS 中使用的核心转储格式。
- 当使用 GDB 附加到一个进程时,break-all 将结束该进程。
- 要在 macOS 上使用 GDB,还需要完成其他手动安装步骤。请参阅 README 文件中的
6. 下一个步骤
继续往下读,你会发现:
- 为用于 Linux 的 Windows 子系统配置 VS Code
- 为 Mingw-w64 和 GCC 配置 VS Code
- 为 macOS 配置 VS Code
- 基本编辑 —— 了解功能强大的 VS Code 编辑器。
- 代码导航 —— 快速浏览源代码。
- 任务 —— 使用 tasks 来构建您的项目以及更多
- 调试 —— 了解如何在项目中使用调试器
7. 常见问题
7.1 我的项目无法加载
VS Code 目前不支持 C++ project 文件,而是将您选择的一个目录作为项目的工作区。该目录及其子目录中的源代码文件是工作区的一部分。
7.2 我如何构建/运行我的项目?
VS Code 支持您可以配置来构建应用程序的任务,并且能够理解 MSBuild、CSC 和 XBuild 的输出。有关更多信息,请参见任务文档。
如果您有任何其他问题或遇到任何问题,请在 GitHub 上提交一个问题。