PS:此文章仅适合在 Linux 平台下配置和初始化
系统:Ubuntu 20.04
Vscode 版本:1.66.2 以上即可
编程语言:以 C++ 和 Python 为例,其他语言大致相同
1、VSCode 简介 {#1、VSCode-简介}
VSCode 是一款微软出的轻量级编辑器,它本身只是一款文本编辑器而已,并不是 IDE (集成开发环境),不包含编译器(compiler)和许多其他功能,所以编译器要自己装;所有的功能都是以插件扩展的形式所存在,想用什么功能就安装对应的扩展即可,非常方便,同时也支持非常多的主题和图标,外观比较好看,重要的是VSCode支持各大主流操作系统,包括Windows、Linux 和 Mac OS,属于跨平台应用。
2、VSCode 扩展 {#2、VSCode-扩展}
在 VSCode 里面集成了非常多的扩展可以使用,当需要用到的是时候,直接搜索进行安装即可。
在写 C++ 程序之前需要安装 C++ 的扩展。
- C/C++:又名 cpptools,提供Debug和Format功能
- Code Runner:右键即可编译运行单文件,很方便;但无法Debug
3、配置代码模板 {#3、配置代码模板}
在 Vscode 中写代码,每次新建一个 cpp 代码文件都要重复写 include 就觉得挺麻烦的,所以要像其他 IDE 那样新建文件,对应的代码模板就出来了,在 Vscode 中也可以用进行设置代码模板,然后一键生成!
首先通过如下路径打开选择框,文件-->首选项-->配置用户代码片段:
输入要配置的文件类型:
C++ 配置方式:
把代码片段写在json里。每个代码段都是在一个代码片段名称下定义的,并且有prefix、body和description。prefix是用来触发代码片段的。使用 $1,$2 等指定光标位置,这些数字指定了光标跳转的顺序,$0表示最终光标位置。
注意:新文件中可能会有解释代码,是用来生成空的文档的,需要将他们全部注释,包括括号(统统注释)
|------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| "Print to console" : { "prefix" : "C++" , //在新建立的页面中输入C++就会有智能提示,Tab就自动生成好了 "body" : [ "#include <iostream>" , "#include <vector>" , //可以自行添加头文件 "" , //空行 "using namespace std;" , //标准命名空间 "" , "int main()" , //main()函数 "{" , " $0" , //最终光标会在这里等待输入 " system(\"pause\");" , //标准C++的等待用户动作 " return 0;" , //结束 "}" , "" , ] , "description" : "A cpp file template." //用户输入后智能提示的内容(你可以用中文写"生成C++模板") }
|
在新文件中使用模板,在文件开头输入关键字 "c++" 即可:
C ++ 效果:
python 配置方式:
配置文件:
|---------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| "Print to console" : { "prefix" : "python" , "body" : [ "#!/usr/bin/env python" , "# -*-coding:utf-8 -*-" , "" , "'''" , "# Time : " , "# Author :蓝陌" , "# version : python 3.8" , "# Description : " , "'''" , "" , "$0" , ] , "description" : "A Python file template." }
|
在新文件中使用模板,在文件开头输入关键字 "Python" 即可
Python 效果:
其他语言的模板文件配置方法也是类似。
4、格式化代码 {#4、格式化代码}
为什么会有格式化代码?
当每天进行 C V 工程师的工作时往往需要各种代码进行结合,多多少少会出现一些格式不一样的代码,又挺难分析他人的代码,导致所有代码乱七八糟的,这是时候就需要把代码进行整理一下。
在VSCode中进行代码格式化:
- 方法一:右键选择 " 格式化文档 "
- 方法二:shift+alt+F
格式化之后:
5、代码运行,代码调试 {#5、代码运行,代码调试}
前期准备 {#前期准备}
在调试前需要配置几个 .json文件
创建一个你打算存放代码的文件夹,称作工作空间(workspace)
- 路径不能包含中文和引号,最好不要有空格
- C和C++需要分别建立不同的文件夹,除非用虚拟工作区。
在工作空间新建文件夹,名称为 .vscode
然后创建 launch.json
, tasks.json
, settings.json
(不是setting.json) 放到.vscode文件夹下。
如果不想手动创建,可以直接运行一遍调试,它会自动创建 launch.json
文件。
launch.json {#launch-json}
该 launch.json 文件用于在 VSC 中配置调试器。
- externalConsole 可根据自己喜好修改;
- externalConsole 设为false可以使用内置终端
- cwd 可以是程序运行时的相对路径,如果有需要可以改为${fileDirname}。
- type 和 request 不变色是正常现象。
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| // https://code.visualstudio.com/docs/cpp/launch-json-reference { "version" : "0.2.0" , "configurations" : [ { "name" : "(gdb) Launch" , // 配置名称,将会在启动配置的下拉菜单中显示 "type" : "cppdbg" , // 配置类型,cppdbg对应cpptools提供的调试功能;可以认为此处只能是cppdbg "request" : "launch" , // 请求配置类型,可以为launch(启动)或attach(附加) "program" : "${fileDirname}/${fileBasenameNoExtension}" , // 将要进行调试的程序的路径 "args" : [ ] , // 程序调试时传递给程序的命令行参数,一般设为空即可 "stopAtEntry" : false , // 设为true时程序将暂停在程序入口处,相当于在main上打断点 "cwd" : "${workspaceFolder}" , // 调试程序时的工作目录,此为工作区文件夹;改成${fileDirname}可变为文件所在目录 "environment" : [ ] , // 环境变量 "externalConsole" : true , // 使用单独的cmd窗口,与其它IDE一致;为false时使用内置终端 "internalConsoleOptions" : "neverOpen" , // 如果不设为neverOpen,调试时会跳到"调试控制台"选项卡,你应该不需要对gdb手动输命令吧? "MIMode" : "gdb" , // 指定连接的调试器,可以为gdb或lldb。但我没试过lldb "miDebuggerPath" : "gdb" , // 调试器路径,Windows下后缀不能省略,Linux下则不要 "setupCommands" : [ { // 模板自带,好像可以更好地显示STL容器的内容,具体作用自行Google "description" : "Enable pretty-printing for gdb" , "text" : "-enable-pretty-printing" , "ignoreFailures" : false } ] , "preLaunchTask" : "Compile" // 调试会话开始前执行的任务,一般为编译程序。与tasks.json的label相对应 } ] } // 或: { "configurations" : [ { "name" : "C/C++_debug" , "type" : "cppdbg" , "request" : "launch" , "program" : "${fileDirname}/${fileBasenameNoExtension}" , "args" : [ ] , "stopAtEntry" : false , "cwd" : "${fileDirname}" , "environment" : [ ] , "externalConsole" : false , "MIMode" : "gdb" , "setupCommands" : [ { "description" : "为 gdb 启用整齐打印" , "text" : "-enable-pretty-printing" , "ignoreFailures" : true } , { "description" : "将反汇编风格设置为 Intel" , "text" : "-gdb-set disassembly-flavor intel" , "ignoreFailures" : true } ] , "preLaunchTask" : "C/C++: g++ 生成活动文件" , "miDebuggerPath" : "/usr/bin/gdb" } ] , "version" : "2.0.0" }
|
tasks.json {#tasks-json}
任务文件(如编译)
如果是编写 C++,编译器需要改成 g++
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| // https://code.visualstudio.com/docs/editor/tasks { "version" : "2.0.0" , "tasks" : [ { "label" : "Compile" , // 任务名称,与launch.json的preLaunchTask相对应 "command" : "gcc" , // 要使用的编译器,C++用g++ "args" : [ "${file}" , "-o" , // 指定输出文件名,不加该参数则默认输出a.exe,Linux下默认a.out "${fileDirname}/${fileBasenameNoExtension}" , "-g" , // 生成和调试有关的信息 "-m64" , // 不知为何有时会生成16位应用而无法运行,加上此条可强制生成64位的 "-Wall" , // 开启额外警告 "-static-libgcc" , // 静态链接libgcc,一般都会加上 "-fexec-charset=GBK" , // 生成的程序使用GBK编码,不加这条会导致Win下输出中文乱码;繁体系统改成BIG5 // "-std=c11", // 要用的语言标准,根据自己的需要修改。c++可用c++14 ] , // 编译的命令,其实相当于VSC帮你在终端中输了这些东西 "type" : "process" , // process是把预定义变量和转义解析后直接全部传给command;shell相当于先打开shell再输入命令,所以args还会经过shell再解析一遍 "group" : { "kind" : "build" , "isDefault" : true // 不为true时ctrl shift B就要手动选择了 } , "presentation" : { "echo" : true , "reveal" : "always" , // 执行任务时是否跳转到终端面板,可以为always,silent,never。具体参见VSC的文档 "focus" : false , // 设为true后可以使执行task时焦点聚集在终端,但对编译C/C++来说,设为true没有意义 "panel" : "shared" // 不同的文件的编译信息共享一个终端面板 } , "problemMatcher" : "$gcc" // 捕捉编译时终端里的报错信息到问题面板中,修改代码后需要重新编译才会再次触发 // 本来有Lint,再开problemMatcher就有双重报错,但MinGW的Lint效果实在太差了;用Clang可以注释掉 } ] } // 或: { "tasks" : [ { "type" : "cppbuild" , "label" : "C/C++: g++ 生成活动文件" , "command" : "/usr/bin/g++" , "args" : [ "-fdiagnostics-color=always" , "-g" , "${file}" , "-o" , "${fileDirname}/${fileBasenameNoExtension}" ] , "options" : { "cwd" : "${fileDirname}" } , "problemMatcher" : [ "$gcc" ] , "group" : "build" , "detail" : "调试器生成的任务。" } , { "type" : "cppbuild" , "label" : "C/C++: cpp 生成活动文件" , "command" : "/usr/bin/cpp" , "args" : [ "-fdiagnostics-color=always" , "-g" , "${file}" , "-o" , "${fileDirname}/${fileBasenameNoExtension}" ] , "options" : { "cwd" : "${fileDirname}" } , "problemMatcher" : [ "$gcc" ] , "group" : { "kind" : "build" , "isDefault" : true } , "detail" : "调试器生成的任务。" } ] , "version" : "2.0.0" }
|
settings.json {#settings-json}
把这个文件里的东西放到"用户设置"里可以覆盖全局设置,否则只有在当前工作区才有效。
Code Runner的命令行和某些选项可以根据自己的需要在此处修改,想要自定义或者想知道是什么意思还是参见此扩展的文档和百度gcc使用教程。
|------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| { "files.defaultLanguage" : "c" , // ctrl+N新建文件后默认的语言 "editor.formatOnType" : true , // 输入分号(C/C++的语句结束标识)后自动格式化当前这一行的代码 "editor.suggest.snippetsPreventQuickSuggestions" : false , // clangd的snippets有很多的跳转点,不用这个就必须手动触发Intellisense了 "editor.acceptSuggestionOnEnter" : "off" , // 我个人的习惯,按回车时一定是真正的换行,只有tab才会接受Intellisense // "editor.snippetSuggestions": "top", // (可选)snippets显示在补全列表顶端,默认是inline "code-runner.runInTerminal" : true , // 设置成false会在"输出"中输出,无法输入 "code-runner.executorMap" : { "c" : "gcc '$fileName' -o '$fileNameWithoutExt.exe' -Wall -O2 -m64 -lm -static-libgcc -std=c11 -fexec-charset=GBK && &'./$fileNameWithoutExt.exe'" , "cpp" : "g++ '$fileName' -o '$fileNameWithoutExt.exe' -Wall -O2 -m64 -static-libgcc -std=c++14 -fexec-charset=GBK && &'./$fileNameWithoutExt.exe'" // "c": "gcc $fileName -o $fileNameWithoutExt.exe -Wall -O2 -m64 -lm -static-libgcc -std=c11 -fexec-charset=GBK && $dir$fileNameWithoutExt.exe", // "cpp": "g++ $fileName -o $fileNameWithoutExt.exe -Wall -O2 -m64 -static-libgcc -std=c++14 -fexec-charset=GBK && $dir$fileNameWithoutExt.exe" } , // 右键run code时运行的命令;未注释的仅适用于PowerShell(Win10默认)和pwsh,文件名中有空格也可以编译运行;注释掉的适用于cmd(win7默认)、PS和bash,但文件名中有空格时无法运行 "code-runner.saveFileBeforeRun" : true , // run code前保存 "code-runner.preserveFocus" : true , // 若为false,run code后光标会聚焦到终端上。如果需要频繁输入数据可设为false "code-runner.clearPreviousOutput" : false , // 每次run code前清空属于code runner的终端消息,默认false "code-runner.ignoreSelection" : true , // 默认为false,效果是鼠标选中一块代码后可以单独执行,但C是编译型语言,不适合这样用 "code-runner.fileDirectoryAsCwd" : true , // 将code runner终端的工作目录切换到文件目录再运行,对依赖cwd的程序产生影响;如果为false,executorMap要加cd $dir "C_Cpp.clang_format_sortIncludes" : true , // 格式化时调整include的顺序(按字母排序) } // 或: { "editor.fontSize" : 20 , "files.associations" : { "iostream" : "cpp" , "ostream" : "cpp" , "random" : "cpp" , "typeinfo" : "cpp" } }
|
在源代码中直接点击行数左侧,即可增加断点,设置好断点之后,点击 "运行和调试" --(gdb)启动,如下,即可开启代码调试了。
可以在变量区直接看到变量值,完成调试目的。
常用的调试按键如下: