Microsoft C / C ++扩展提供了对Visual Studio Code的C / C ++支持,以便在Windows,Linux和macOS上使用VS Code实现跨平台C和C ++开发。该扩展仍处于预览阶段,我们关注的是VS代码运行的所有C和C ++代码的代码编辑,导航和调试支持。
如果您只想要一个轻量级工具来编辑C ++文件,Visual Studio Code是一个很好的选择,但如果您希望获得现有Visual C ++项目的最佳体验或在Windows上进行调试,我们建议您使用Visual Studio IDE的一个版本例如Visual Studio社区。
如果您遇到任何问题或有关于Microsoft C / C ++扩展的建议,请在GitHub上提交问题和建议。如果您尚未提供反馈,请参加此快速调查,以帮助您根据需要制定此扩展程序。
入门
要安装Microsoft C / C ++扩展,请执行以下操作:
- 打开VS代码。
- 单击补充工具栏上的“扩展视图”图标。
- 搜索
c++
。 - 单击“ 安装”,然后单击“ 重新加载”。
安装C / C ++扩展后,打开包含C / C ++源代码的文件夹。VS Code会将各种设置文件放入.vscode
子文件夹中。
注意:C / C ++扩展不包括C ++编译器或调试器。您需要安装这些工具或使用计算机上已安装的工具。流行的C ++编译器是用于Windows的mingw-w64,用于macOS的XCode的 Clang 和用于Linux的GCC。确保您的编译器可执行文件位于您的平台路径中,以便扩展程序可以找到它。该扩展还支持Windows的Windows子系统。
配置IntelliSense
扩展程序将尝试根据您在系统上找到的编译器确定文件夹的基本配置信息。如果由于任何原因,该配置不完整,您可以c_cpp_properties.json
通过从命令选项板运行C / Cpp:Edit configurations ...命令生成文件(⇧⌘P并添加缺少的信息。
如果#include
找不到文件或其中一个依赖项,您还可以单击include语句下的绿色曲线来查看有关如何更新配置的建议。
这将生成一个c_cpp_properties.json
文件,允许您添加其他路径并定义以正确启用代码导航和自动完成。
下面您可以看到MinGW C ++编译器已被设置为Windows的默认编译器。扩展将使用该信息来确定系统包含路径和定义,以便不需要添加它们c_cpp_properties.json
。
{
"name": "Win32",
"includePath": [
"${workspaceFolder}"
],
"defines": [
"_DEBUG",
"UNICODE"
],
"compilerPath": "C:\mingw-w64\bin\gcc.exe",
"intelliSenseMode": "clang-x64",
"browse": {
"path": [
"${workspaceFolder}"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
}
}
构建代码
如果要从VS Code构建应用程序,则需要生成一个tasks.json
文件:
- 打开命令选项板(⇧⌘P)。
- 选择Tasks:Configure Tasks ...命令,单击模板中的Create tasks.json文件,您将看到任务运行器模板列表。
- 选择Others以创建运行外部命令的任务。
- 更改为
command
用于构建应用程序的命令行表达式(例如g++
)。 - 添加任何必需的args(例如
-g
构建用于调试)。 - 您还可以将其更改
label
为更具描述性。
您现在应该tasks.json
在工作区.vscode
文件夹中看到一个类似于以下内容的文件:
{
"version": "2.0.0",
"tasks": [
{
"label": "build hello world",
"type": "shell",
"command": "g++",
"args": [
"-g", "helloworld.cpp"
]
}
]
}
如果您希望能够使用“ 任务:运行构建任务”(⇧⌘B)构建应用程序,则可以将其添加到build
组中。
{
"version": "2.0.0",
"tasks": [
{
"label": "build hello world",
"type": "shell",
"command": "g++",
"args": [
"-g", "helloworld.cpp"
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
有关任务的更多信息,请参阅通过任务与外部工具集成。
调试代码
要启用调试,您需要生成一个launch.json
文件:
- 单击补充工具栏中的“调试”图标,导航到“调试”视图。
- 在“ 调试”视图中,单击“ 配置”图标。
- 从“ 选择环境”下拉列表中选择
C++ (GDB/LLDB)
(以使用GDB或LLDB)或C++ (Windows)
(以使用Visual Studio Windows调试程序)。这将使用两种配置创建一个用于编辑的文件:launch.json
- C ++ Launch定义了在开始调试时启动应用程序的属性。
- C ++ Attach定义了附加到已经运行的进程的属性。
program
使用您正在调试的程序的路径更新该属性。- 如果您希望在开始调试时构建应用程序,请添加一个
preLaunchTask
属性,其中包含您在其中创建的构建任务的名称tasks.json
(上例中的“构建hello world”)。
下面是使用MinGW GDB调试器的示例:
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/a.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"miDebuggerPath": "C:\mingw\bin\gdb.exe",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "build hello world"
}
]
}
要了解更多信息,请参阅配置launch.json以进行C / C ++调试。
如果在Windows上使用GDB进行调试,请参阅使用GDB进行Windows调试。
编辑代码
代码格式
Visual Studio Code的C / C ++扩展支持使用扩展名附带的clang格式进行源代码格式化。
您可以使用格式文档(⇧⌥F)格式化整个文件,也可以使用右键单击上下文菜单中的格式选择(⌘K⌘F)格式化当前选择。您还可以使用以下设置配置自动格式化:
editor.formatOnSave
- 保存文件时格式化。editor.formatOnType
- 在键入时格式化(在;字符上触发)。
默认情况下,clang格式样式设置为“file”,这意味着它会.clang-format
在工作区内查找文件。如果.clang-format
找到该文件,则根据文件中指定的设置应用格式。如果.clang-format
工作区中未找到任何文件,则会根据C_Cpp.clang_format_fallbackStyle
设置中指定的默认样式应用格式设置。目前,默认格式样式是“Visual Studio”,它是Visual Studio中默认代码格式化程序的近似值。
“Visual Studio”clang格式样式还不是官方的OOTB clang格式样式,但它暗示了以下clang格式设置:
UseTab: (VS Code current setting)
IndentWidth: (VS Code current setting)
BreakBeforeBraces: AllMan
AllowShortIfStatementsOnASingleLine: false
IndentCaseLabels: false
ColumnLimit: 0
如果您要使用与扩展名附带的格式不同的clang格式版本,则可以使用该C_Cpp.clang_format_path
设置并将其值设置为安装clang格式二进制文件的路径。
例如,在Windows平台上:
"C_Cpp.clang_format_path": "C:\Program Files (x86)\LLVM\bin\clang-format.exe"
自动完成
自动完成由与Visual Studio相同的引擎提供支持。当您的工作区配置了所有必需的包含路径和定义时,您将获得最相关的建议(请参阅上面的“配置IntelliSense”部分)。
导航代码
C / C ++扩展提供的源代码导航功能是理解和绕过代码库的强大工具。这些功能由存储在符号信息的离线数据库中的标签提供支持。安装了C / C ++扩展后,只要将包含C ++源代码文件的文件夹加载到VS代码中,就会生成此数据库。当标记解析器生成此信息时,数据库图标将显示在活动配置名称旁边(下图中的“Win32”)。
当图标消失时,源代码符号已在脱机数据库中标记。
指定其他包含目录以获得更好的符号支持
为了提供最佳体验,VS Code的C / C ++扩展需要知道它在哪里可以找到代码中引用的每个头文件。默认情况下,扩展名搜索当前源目录,其子目录和某些特定于平台的位置。如果找不到引用的头文件,VS Code会在引用它的每个#include指令下面显示绿色波形。
要指定要搜索的其他包含目录,请将光标放在显示绿色波浪线的任何#include指令上,然后在出现时单击灯泡操作。这将打开文件c_cpp_properties.json
进行编辑; 在这里,您可以通过向“browse.path”属性添加更多目录来单独为每个平台配置指定其他包含目录。
搜索符号
您可以在当前文件或工作区中搜索符号,以便更快地导航代码。
要在当前文件中搜索符号,请按⇧⌘O,然后输入您要查找的符号的名称。将显示潜在匹配列表,并在您键入时进行过滤。从匹配列表中选择以导航到其位置。
要在当前工作空间中搜索符号,请按⌘T,然后输入符号的名称。潜在匹配列表将如前所示。如果您选择的文件尚未打开,则会在导航到匹配位置之前打开该文件。
或者,如果您愿意,可以通过命令选项板访问这些命令来搜索符号。使用快速打开(⌘P)然后输入'@'命令搜索当前文件,或输入'#'命令搜索当前工作区。⇧⌘O和⌘T分别只是'@'和'#'命令的快捷方式,所以一切都是一样的。
窥视定义
您可以使用Peek Definition功能快速查看符号的定义方式。此功能在窥视窗口内的定义附近显示几行代码,因此您可以在不离开当前位置的情况下查看。
要查看符号的定义,请将光标放在源代码中使用的任何位置的符号上,然后按⌥F12。或者,您可以从上下文菜单中选择Peek Definition(右键单击,然后选择Peek Definition)。
目前,C / C ++扩展不会以某种方式解析代码,以帮助它根据符号的使用方式区分竞争定义。当符号在不同的上下文中定义不同的事物时会出现这些竞争定义,例如在重载函数,类及其构造函数以及其他情况下发生。发生这种情况时,每个竞争定义都列在窥视窗口的右侧,当前选择的源代码显示在左侧。
打开窥视窗口,浏览竞争定义列表以找到您感兴趣的定义。如果要导航到其中一个定义的位置,只需双击您感兴趣的定义,或者按双击查看窗口左侧显示的源代码中的任意位置。
转到定义
您还可以使用“转到定义”功能快速导航到定义符号的位置。
要转到符号的定义,请将光标放在源代码中使用的符号上,然后按F12。或者,您可以从上下文菜单中选择“ 转到定义 ”(右键单击,然后选择“ 转到定义”)。如果只有一个符号定义,您将直接导航到其位置,否则竞争定义将显示在上一节中所述的查看窗口中,您必须选择要转到的定义。
调试
按照“ 入门”中的说明设置调试环境的基础知识后,您可以在本节中了解有关调试C / C ++的更多详细信息。
VS Code支持以下C / C ++调试器,具体取决于您使用的操作系统:
- Linux:GDB
- macOS:LLDB或GDB
- Windows:Visual Studio Windows调试器或GDB(使用Cygwin或MinGW)
使用GDB进行Windows调试
您可以使用VS Code调试使用Cygwin或MinGW创建的Windows应用程序。要使用Cygwin或MinGW调试功能,必须在启动配置(launch.json
)中手动设置调试器路径。要调试Cygwin或MinGW应用程序,请添加该miDebuggerPath
属性并将其值设置为Cygwin或MinGW环境的相应gdb.exe的位置。
例如:
"miDebuggerPath": "c:\mingw\bin\gdb.exe"
Windows上的Cygwin / MinGW调试支持附加和启动调试方案。
条件断点
条件断点使您只有在条件的值为true时才能在特定代码行上中断执行。要设置条件断点,请右键单击现有断点,然后选择“ 编辑断点”。这将打开一个小的查看窗口,您可以在其中输入必须评估为true的条件,以便在调试期间命中断点。
在编辑器中,条件断点由断点符号表示,断点符号内部有一个黑色等号。您可以将光标放在条件断点上以显示其条件。
功能断点
函数断点使您能够在函数的开头而不是在特定的代码行上中断执行。要设置函数断点,请在“ 调试”窗格中右键单击“ 断点”部分,然后选择“ 添加函数断点”并输入要在其上执行的函数的名称。
表达评估
VS Code支持在几种情况下进行表达式评估:
- 您可以在“ 调试”面板的“ 监视”部分中键入表达式,并在每次遇到断点时对其进行评估。
- 您可以在调试控制台中键入表达式,它只会被评估一次。
- 您可以在断点处停止时评估代码中出现的任何表达式。
请注意,Watch部分中的表达式在正在调试的应用程序中生效; 修改变量值的表达式将在程序的持续时间内修改该变量。
多线程调试
VS Code的C / C ++扩展能够调试多线程程序。所有线程及其调用堆栈都显示在“ 调用堆栈”部分中:
内存转储调试
VS Code的C / C ++扩展还具有调试内存转储的能力。要调试内存转储,请打开launch.json
文件并将coreDumpPath
(对于GDB或LLDB)或dumpPath
(对于Visual Studio Windows调试器)属性添加到C ++启动配置,将其值设置为包含内存转储路径的字符串。这甚至适用于在x64机器上调试的x86程序。
附加符号
如果存在调试器可以找到符号文件的其他目录(例如,.pdb
Visual Studio Windows调试器的文件),则可以通过添加additionalSOLibSearchPath
(对于GDB或LLDB)或symbolSearchPath
(对于Visual Studio Windows调试器)来指定它们。
例如:
"additionalSOLibSearchPath": "/path/to/symbols;/another/path/to/symbols"
要么
"symbolSearchPath": "C:\path\to\symbols;C:\another\path\to\symbols"
找到源文件
如果源文件不在编译位置,则可以更改源文件位置。这是通过本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"
}
GDB,LLDB和MI命令(GDB / LLDB)
对于C++ (GDB/LLDB)
调试环境,您可以使用该命令直接通过调试控制台执行GDB,LLDB和MI命令-exec
,但要小心,直接在调试控制台中执行命令是未经测试的,并且在某些情况下可能会导致VS Code崩溃。
其他调试功能
- 无条件断点
- 观察窗口
- 调用堆栈
- 步进
有关使用VS Code进行调试的更多信息,请参阅VS Code中的调试简介。
已知限制
符号和代码导航
所有平台:
- 因为扩展不解析函数体,所以Peek Definition和Go to Definition不适用于函数体内定义的符号。
调试
视窗:
- Cygwin和MinGW上的GDB无法打破正在运行的进程。要在应用程序运行时设置断点(未在调试器下停止),或暂停正在调试的应用程序,请在应用程序终端中按Ctrl-C。
- Cygwin上的GDB无法打开核心转储。
Linux的:
- GDB需要提升权限才能附加到进程。使用attach进行处理时,需要在调试会话开始之前提供密码。
苹果系统:
- LLDB:
- 使用LLDB进行调试时,如果在中断模式下关闭终端窗口,则调试不会停止。按“ 停止”按钮可以停止调试。
- 停止调试时,终端窗口未关闭。
- GDB:
- 需要完成其他手动安装步骤才能在macOS上使用GDB。见的OS X GDB的手动安装的自述。
- 使用GDB附加到进程时,无法中断正在调试的应用程序。GDB将仅绑定应用程序未运行时设置的断点(在连接到应用程序之前或应用程序处于停止状态时)。这是由于GDB中的一个错误。
- 使用GDB进行调试时无法加载核心转储,因为GDB 不支持macOS中使用的核心转储格式。
- 当使用GDB附加到进程时,break-all将结束该进程。
下一步
请继续阅读以了解:
常见问题
问:我的项目不会加载。
答: VS Code目前不支持C ++项目文件,而是将您选择的目录视为项目的工作区。该目录及其子目录中的源代码文件是工作区的一部分。
问:如何构建/运行我的项目?
答: VS Code支持您可以配置以构建应用程序的任务,并且本机地了解MSBuild,CSC和XBuild的输出。有关更多信息,请参阅任务文档。
如果您有任何其他问题或遇到任何问题,请在GitHub上提出问题。