PS:此文章仅适合在 Linux 平台下配置和初始化

系统:Ubuntu 20.04

Vscode 版本:1.66.2 以上即可

编程语言:以 C++ 和 Python 为例,其他语言大致相同

1、VSCode 简介

VSCode 是一款微软出的轻量级编辑器,它本身只是一款文本编辑器而已,并不是 IDE (集成开发环境),不包含编译器(compiler)和许多其他功能,所以编译器要自己装;所有的功能都是以插件扩展的形式所存在,想用什么功能就安装对应的扩展即可,非常方便,同时也支持非常多的主题和图标,外观比较好看,重要的是VSCode支持各大主流操作系统,包括Windows、Linux 和 Mac OS,属于跨平台应用。

20230406234236

2、VSCode 扩展

在 VSCode 里面集成了非常多的扩展可以使用,当需要用到的是时候,直接搜索进行安装即可。

在写 C++ 程序之前需要安装 C++ 的扩展。

  • C/C++:又名 cpptools,提供Debug和Format功能
  • Code Runner:右键即可编译运行单文件,很方便;但无法Debug

3、配置代码模板

在 Vscode 中写代码,每次新建一个 cpp 代码文件都要重复写 include 就觉得挺麻烦的,所以要像其他 IDE 那样新建文件,对应的代码模板就出来了,在 Vscode 中也可以用进行设置代码模板,然后一键生成!

首先通过如下路径打开选择框,文件–>首选项–>配置用户代码片段:

image-20230404000819962

输入要配置的文件类型:

C++ 配置方式:

20230404001108

把代码片段写在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++模板”)
}

20230404001631

在新文件中使用模板,在文件开头输入关键字 “c++” 即可:

20230404001830

C ++ 效果:

20230404001904

python 配置方式:

20230404002037

配置文件:

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 效果:

20230404003050

其他语言的模板文件配置方法也是类似。

4、格式化代码

为什么会有格式化代码?

当每天进行 C V 工程师的工作时往往需要各种代码进行结合,多多少少会出现一些格式不一样的代码,又挺难分析他人的代码,导致所有代码乱七八糟的,这是时候就需要把代码进行整理一下。

20230406223648

在VSCode中进行代码格式化:

  • 方法一:右键选择 “ 格式化文档 ”
  • 方法二:shift+alt+F

格式化之后:

20230406225310

5、代码运行,代码调试

前期准备

在调试前需要配置几个 .json文件

创建一个你打算存放代码的文件夹,称作工作空间(workspace)

  • 路径不能包含中文和引号,最好不要有空格
  • C和C++需要分别建立不同的文件夹,除非用虚拟工作区。

在工作空间新建文件夹,名称为.vscode

然后创建 launch.jsontasks.jsonsettings.json(不是setting.json) 放到.vscode文件夹下。

20201006202036218

如果不想手动创建,可以直接运行一遍调试,它会自动创建 launch.json 文件。

20230406204410

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

任务文件(如编译)

如果是编写 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

把这个文件里的东西放到“用户设置”里可以覆盖全局设置,否则只有在当前工作区才有效。

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)启动,如下,即可开启代码调试了。

20230406232846

可以在变量区直接看到变量值,完成调试目的。

20230406232015

常用的调试按键如下:

20230406232108