经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
我用VScode编写C / C ++代码三年才知道
来源:今日头条  作者:CPP语言编程  时间:2019/8/13 8:42:51  对本文有异议

建议配合使用CMake,或者codeblock下载完直接用吧。

建议搭配好gcc 和gdb环境,但是没办法和vs那样查看内存,只能敲命令查看。但还是希望分享出来给大家! 推荐使用☆☆☆

gcc和gdb后续文章中会发表详解给大家,记得关注我。

Microsoft C / C ++扩展提供了对Visual Studio Code的C / C ++支持,以便在Windows,Linux和macOS上使用VS Code实现跨平台C和C ++开发。该扩展仍处于预览阶段,我们关注的是VS代码运行的所有C和C ++代码的代码编辑,导航和调试支持。

1.jpg

如果您只想要一个轻量级工具来编辑C ++文件,Visual Studio Code是一个很好的选择,但如果您希望获得现有Visual C ++项目的最佳体验或在Windows上进行调试,我们建议您使用Visual Studio IDE的一个版本例如Visual Studio社区。

如果您遇到任何问题或有关于Microsoft C / C ++扩展的建议,请在GitHub上提交问题和建议。如果您尚未提供反馈,请参加此快速调查,以帮助您根据需要制定此扩展程序。

入门

要安装Microsoft C / C ++扩展,请执行以下操作:

  • 打开VS代码。单击补充工具栏上的“扩展视图”图标。搜索c++。单击“ 安装”,然后单击“ 重新加载”。

2.jpg

安装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语句下的绿色曲线来查看有关如何更新配置的建议。

3.jpg

这将生成一个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.jsonC ++ 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”)。

4.jpg

当图标消失时,源代码符号已在脱机数据库中标记。

指定其他包含目录以获得更好的符号支持

为了提供最佳体验,VS Code的C / C ++扩展需要知道它在哪里可以找到代码中引用的每个头文件。默认情况下,扩展名搜索当前源目录,其子目录和某些特定于平台的位置。如果找不到引用的头文件,VS Code会在引用它的每个#include指令下面显示绿色波形。

要指定要搜索的其他包含目录,请将光标放在显示绿色波浪线的任何#include指令上,然后在出现时单击灯泡操作。这将打开文件c_cpp_properties.json进行编辑; 在这里,您可以通过向“browse.path”属性添加更多目录来单独为每个平台配置指定其他包含目录。

搜索符号

您可以在当前文件或工作区中搜索符号,以便更快地导航代码。

要在当前文件中搜索符号,请按??O,然后输入您要查找的符号的名称。将显示潜在匹配列表,并在您键入时进行过滤。从匹配列表中选择以导航到其位置。

5.jpg

要在当前工作空间中搜索符号,请按?T,然后输入符号的名称。潜在匹配列表将如前所示。如果您选择的文件尚未打开,则会在导航到匹配位置之前打开该文件。

6.jpg

或者,如果您愿意,可以通过命令选项板访问这些命令来搜索符号。使用快速打开(?P)然后输入'@'命令搜索当前文件,或输入'#'命令搜索当前工作区。??O和?T分别只是'@'和'#'命令的快捷方式,所以一切都是一样的。

窥视定义

您可以使用Peek Definition功能快速查看符号的定义方式。此功能在窥视窗口内的定义附近显示几行代码,因此您可以在不离开当前位置的情况下查看。

要查看符号的定义,请将光标放在源代码中使用的任何位置的符号上,然后按?F12。或者,您可以从上下文菜单中选择Peek Definition(右键单击,然后选择Peek Definition)。

7.jpg

目前,C / C ++扩展不会以某种方式解析代码,以帮助它根据符号的使用方式区分竞争定义。当符号在不同的上下文中定义不同的事物时会出现这些竞争定义,例如在重载函数,类及其构造函数以及其他情况下发生。发生这种情况时,每个竞争定义都列在窥视窗口的右侧,当前选择的源代码显示在左侧。

打开窥视窗口,浏览竞争定义列表以找到您感兴趣的定义。如果要导航到其中一个定义的位置,只需双击您感兴趣的定义,或者按双击查看窗口左侧显示的源代码中的任意位置。

转到定义

您还可以使用“转到定义”功能快速导航到定义符号的位置。

要转到符号的定义,请将光标放在源代码中使用的符号上,然后按F12。或者,您可以从上下文菜单中选择“ 转到定义 ”(右键单击,然后选择“ 转到定义”)。如果只有一个符号定义,您将直接导航到其位置,否则竞争定义将显示在上一节中所述的查看窗口中,您必须选择要转到的定义。

调试

按照“ 入门”中的说明设置调试环境的基础知识后,您可以在本节中了解有关调试C / C ++的更多详细信息。

VS Code支持以下C / C ++调试器,具体取决于您使用的操作系统:

  • Linux:GDBmacOS:LLDB或GDBWindows: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的条件,以便在调试期间命中断点。

8.jpg

在编辑器中,条件断点由断点符号表示,断点符号内部有一个黑色等号。您可以将光标放在条件断点上以显示其条件。

功能断点

函数断点使您能够在函数的开头而不是在特定的代码行上中断执行。要设置函数断点,请在“ 调试”窗格中右键单击“ 断点”部分,然后选择“ 添加函数断点”并输入要在其上执行的函数的名称。

表达评估

VS Code支持在几种情况下进行表达式评估:

  • 您可以在“ 调试”面板的“ 监视”部分中键入表达式,并在每次遇到断点时对其进行评估。您可以在调试控制台中键入表达式,它只会被评估一次。您可以在断点处停止时评估代码中出现的任何表达式。

请注意,Watch部分中的表达式在正在调试的应用程序中生效; 修改变量值的表达式将在程序的持续时间内修改该变量。

多线程调试

VS Code的C / C ++扩展能够调试多线程程序。所有线程及其调用堆栈都显示在“ 调用堆栈”部分中:

9.jpg

内存转储调试

VS Code的C / C ++扩展还具有调试内存转储的能力。要调试内存转储,请打开launch.json文件并将coreDumpPath(对于GDB或LLDB)或dumpPath(对于Visual Studio Windows调试器)属性添加到C ++启动配置,将其值设置为包含内存转储路径的字符串。这甚至适用于在x64机器上调试的x86程序。

附加符号

如果存在调试器可以找到符号文件的其他目录(例如,.pdbVisual 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进行处理时,需要在调试会话开始之前提供密码。

IOS系统:

  • LLDB:使用LLDB进行调试时,如果在中断模式下关闭终端窗口,则调试不会停止。按“ 停止”按钮可以停止调试。停止调试时,终端窗口未关闭。

  • GDB:需要完成其他手动安装步骤才能在macOS上使用GDB。见的OS X GDB的手动安装的自述。使用GDB附加到进程时,无法中断正在调试的应用程序。GDB将仅绑定应用程序未运行时设置的断点(在连接到应用程序之前或应用程序处于停止状态时)。这是由于GDB中的一个错误。使用GDB进行调试时无法加载核心转储,因为GDB 不支持macOS中使用的核心转储格式。当使用GDB附加到进程时,break-all将结束该进程。

下一步

请继续阅读以了解:

  • 基本编辑 - 了解强大的VS代码编辑器。代码导航 - 快速浏览源代码。任务 - 使用任务来构建项目等调试 - 了解如何在项目中使用调试器

常见问题

问:我的项目不会加载。

答: VS Code目前不支持C ++项目文件,而是将您选择的目录视为项目的工作区。该目录及其子目录中的源代码文件是工作区的一部分。

问:如何构建/运行我的项目?

答: VS Code支持您可以配置以构建应用程序的任务,并且本机地了解MSBuild,CSC和XBuild的输出。有关更多信息,请参阅任务文档。