基于vscode搭建适合学习者的C++环境
前言
写这篇文章主要有两个方面的原因。一是快放假了,晚上睡不着,竞赛也不想搞,找点事做。二是最近想在manjaro上装virtuoso,搞着搞着误操作改了/usr/share权限把系统搞崩了(内心一万只xxx奔腾而过),然后重新整了一遍系统又顺手搭了一下c++开发环境,突然发现vscode太香了QAQ
选择vscode的原因
虽然各人有各人的喜好,但用过各种各样IDE或者文本编辑器的我还是要吐槽几句,细数一下各个软件的“罪状”
-
VC++6.0
这应该是绝大多数人都接触过的一款IDE,优点很明显,简单,不用折腾,比较稳定。但是毛病也不少。- 对C++11及更高标准的支持
vc6.0遵循C++98标准,对有重大功能特性更新的c++11及更高标准均无法支持 - 调试
尽管有着老牌软件中相对突出、易用的监视窗等特点,但如果不正常(或抛出异常)结束,或由点击stop debugging按钮结束,就会留下后台进程,导致不能够正常使用(cannot open link.exe),通常要通过重启软件或由任务管理器关闭后台进程解决 - 编辑器
VC6.0的编辑器对程序员极不友好,在不安装VA的情况下,没有行号,没有highlighting,没有补全,总之该有的都没有
- 对C++11及更高标准的支持
-
DevC++
DevC++是也初学者常用的软件,同时常见于众多ACMer的电脑中。它的一大优点是不需要建立项目,可以直接单文件编译运行,调试也比较方便。且非MS系的IDE均可以自定编译器,对各种语言标准均可支持。当然也有一些问题。。。- 界面
这里有我个人的因素,但我认为DevC++的界面真的很丑 - 调试
DevC++的监视窗不会自动刷新变量,常常导致调试时误判。另外,网上许多版本的DevC++在启动调试时均会异常退出 - 编辑器
括号匹配等可以在设置中打开,然而最大的问题在于补全。DevC++的补全机制是在你输入了一定数量的字符后自动补全后面的字符,常常导致多敲了一个字母,相比MS系IDE的Enter补全十分不便。
- 界面
-
Code::Blocks
非MS系IDE,可以自选编译器及标准,界面相对友好- 调试
我不用CodeBlocks的原因只有这一条,但我认为这足以判它死刑。在调试时如果尝试在监视窗中查看不存在或者越界的数组位置会直接异常退出。另外,在CodeBlocks中把监视窗口调出来本就十分不容易。
- 调试
-
VisualStudio2019Community
由于我没有使用过2019Community以外的VS,特此注明。VS的优点很突出,有丰富的扩展,包括CodeMaid等,对Git有较好的支持,内置LiveShare、Azure等功能,IntelliSense十分贴心,直接把你宠到受不了上面三个…此外,还能够支持多种语言,(可选)集成不同平台、场景下的开发工具。- 你要想送走它,就别想轻易请回来了…
如果你安装后尝试卸载它,你通常需要重装系统才能再次成功安装 - 太大了
对于一个语言学习者来说,无用的功能太多,软件太大,许多人甚至一开始找不到编译运行在哪儿 - 慢
VS的编译是我用过所有IDE里面最慢的,启动也很慢 - 需要进行一些设置
相信有很多学c++的朋友们都遇到过scanf等函数要你换成scanf_s的情况,虽然在SLN设置里面关闭错误提示即可,但新手一般要整好久才能搞明白 - 仍然只支持32位寻址
都1202年了,指针还限制在4Byte - 最后提一句,听说VS要出2022版本了,要迈上64的台阶了,据说速度和各方面能力都会有较大提升,我们拭目以待
- 你要想送走它,就别想轻易请回来了…
-
Clion
这个与VS类似,对与语言学习者来说最大的问题还是功能太多,软件太复杂
vscode特性
说了那么多别的软件,这下总算该到我们的主角了。vscode本质上是一个轻巧的文本编辑器,但又为你提供了各种方便的功能、插件,使你能够客制最使你舒适的编程环境。下面我就来介绍一下vscode的安装与使用(以我的为例)。
特别说明:vscode的配置成功以后相当舒适,但过程中极有可能遇到各种各样的报错,如果自觉承受不了请勿选此路!!!
vscode安装与配置
软件安装
-
Windows下
Windows下直接在vscode官网下载安装包安装即可,建议将其他的四个选项全部勾选
-
Linux下(以我的manjaro Linux为例,archlinux一系的通用)
打开命令行,使用以下指令即可(直接从网站上下载安装包安装会有文字显示的问题,此处从AUR获取软件)yay -S visual-studio-code-bin
如果还没有安装yay,使用以下指令安装
sudo pacman -S yay
软件配置(C++)
-
安装中文扩展
-
安装编译器,这里以g++为例
Windows
首先在source forge上下载mingw(一般会选64bit)
然后配置环境变量
Linux
一般Linux系统已经有g++,直接使用即可,如果没有,archlinux下可用以下指令获取
sudo pacman -S gcc
进行vscode内的相关任务配置
Windows
-
Ctrl+Shift+P调出命令面板,输入C/C++,选择“Edit Configurations(json)”进入配置
以我的配置为例
{ "configurations": [ { "name": "Win32", "includePath": [ "${workspaceFolder}/**" ], "defines": [ "_DEBUG", "UNICODE", "_UNICODE" ], "windowsSdkVersion": "10.0.18362.0", "compilerPath": "D:/Program Files/mingw64/bin/g++.exe", "cStandard": "gnu17", "cppStandard": "gnu++17", "intelliSenseMode": "windows-gcc-x64" } ], "version": 4 }
其中,“compilerPath”“cStandard”“cppStandard”"intelliSenseMode"四项参数是需要根据我们的需求更改的。
"compilerPath"为你的编译器路径(找到我们安装好的MINGW下的bin文件夹)
"cStandard"为C语言标准
"cppStandard"为C++标准
"intelliSenseMode"为IntelliSense模式
- 接下来我们要配置编译生成的任务(tasks)
使用快捷键Ctrl+Shift+P,输入tasks,选择Tasks:Configure Task,进入tasks.json,同样以我的配置为例
{ "version": "2.0.0", "tasks": [ { "label": "build & debug file", "type": "shell", "command": "g++", "args": [ "${file}", "-g", "-o", "${fileDirname}\\${fileBasenameNoExtension}.exe", ], "group": { "kind": "build", "isDefault": true }, "problemMatcher": [] }, { "label": "build & run file", "type": "shell", "command": "g++", "args": [ "${file}", "-o", "${fileDirname}\\${fileBasenameNoExtension}.exe", ], "group": { "kind": "build", "isDefault": true }, "problemMatcher": [] }, { "label": "build with O3 optimize", "type": "shell", "command": "g++", "args": [ "${file}", "-o", "${fileDirname}\\${fileBasenameNoExtension}.exe", "-Q", "-O3", ], "group": { "kind": "build", "isDefault": true }, "problemMatcher": [] }, { "label": "debug with O3 optimize", "type": "shell", "command": "g++", "args": [ "${file}", "-g", "-o", "${fileDirname}\\${fileBasenameNoExtension}.exe", "-Q", "-O3", ], "group": { "kind": "build", "isDefault": true }, "problemMatcher": [] } ] }
让我们来看其中的一段
{ "label": "build & debug file", "type": "shell", "command": "g++", "args": [ "${file}", "-g", "-o", "${fileDirname}\\${fileBasenameNoExtension}.exe", ], "group": { "kind": "build", "isDefault": true }, "problemMatcher": [] }
"label"是这一项生成任务的名称
"command"是这一项生成任务的命令
"args"是传给命令的参数,整合起来,这一项任务执行的命令行命令就是
g++ <file_name> -g -o <output_file_name>
注意用于调试的生成命令中应包含-g参数
-
最后我们进行运行任务的配置
快捷键Ctrl+Shift+P,输入launch,打开launch.json,以我的为例
{ "version": "0.2.0", "configurations": [ { "name": "Run C/C++", "type": "cppdbg", "request": "launch", "program": "${fileDirname}/${fileBasenameNoExtension}.exe", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": true, "MIMode": "gdb", "miDebuggerPath": "D:\\Program Files\\mingw64\\bin\\gdb.exe", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": false } ], "preLaunchTask": "build & run file" }, { "name": "Debug C/C++", "type": "cppdbg", "request": "launch", "program": "${fileDirname}/${fileBasenameNoExtension}.exe", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": true, "MIMode": "gdb", "miDebuggerPath": "D:\\Program Files\\mingw64\\bin\\gdb.exe", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": false } ], "preLaunchTask": "build & debug file" }, { "name": "Debug C/C++ with O3 optimize", "type": "cppdbg", "request": "launch", "program": "${fileDirname}/${fileBasenameNoExtension}.exe", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": true, "MIMode": "gdb", "miDebuggerPath": "D:\\Program Files\\mingw64\\bin\\gdb.exe", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": false } ], "preLaunchTask": "debug with O3 optimize" }, { "name": "Run C/C++ with O3 optimize", "type": "cppdbg", "request": "launch", "program": "${fileDirname}/${fileBasenameNoExtension}.exe", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": true, "MIMode": "gdb", "miDebuggerPath": "D:\\Program Files\\mingw64\\bin\\gdb.exe", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": false } ], "preLaunchTask": "build with O3 optimize" } ] }
其中的一段
"configurations": [ { "name": "Run C/C++", "type": "cppdbg", "request": "launch", "program": "${fileDirname}/${fileBasenameNoExtension}.exe", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": true, "MIMode": "gdb", "miDebuggerPath": "D:\\Program Files\\mingw64\\bin\\gdb.exe", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": false } ], "preLaunchTask": "build & run file" }
其中需要根据情况改动的有:
"name"运行命令名称
"program"可执行文件路径
"stopAtEntry"是否在入口处暂停,true时每次会先在main函数开始处停下
"externalConsole"是否启用外部终端
"MIMode"调试模式,g++为gdb
"miDebuggerPath"调试器路径
"preLaunchTask"预执行任务,注意这一项的值必须是前面tasks中存在的label,调试任务应当对应参数中有-g的生成任务
-
Linux
方法类似,编译器路径可通过以下指令查找
whereis g++
可能的结果如下
g++: /usr/bin/g++ /usr/share/man/man1/g++.1.gz
tasks.json及launch.json的配置与windows下一致,我的配置如下
{ "tasks": [ { "type": "cppbuild", "label": "AMD64编译调试", "command": "/usr/bin/g++", "args": [ "-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}" ], "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true }, "detail": "调试器生成的任务。" }, { "type": "cppbuild", "label": "AMD64编译运行", "command": "/usr/bin/g++", "args": [ "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}" ], "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true }, "detail": "生成的任务。" }, { "type": "cppbuild", "label": "AMD64反汇编", "command": "/usr/bin/objdump", "args": [ "-S", "${fileDirname}/${fileBasenameNoExtension}", ">", "${fileDirname}/${fileBasenameNoExtension}.txt" ], "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true }, "detail": "生成的任务。" }, { "type": "cppbuild", "label": "RISCV编译", "command": "/usr/bin/riscv64-linux-gnu-g++", "args": [ "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}" ], "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true }, "detail": "生成的任务。" }, { "type": "cppbuild", "label": "RISCV反汇编", "command": "/usr/bin/riscv64-linux-gnu-objdump", "args": [ "-S", "${fileDirname}/${fileBasenameNoExtension}", ">", "${fileDirname}/${fileBasenameNoExtension}.txt" ], "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true }, "detail": "生成的任务。" } ], "version": "2.0.0" }
{ "version": "0.2.0", "configurations": [ { "name": "AMD64编译调试", "type": "cppdbg", "request": "launch", "program": "${fileDirname}/${fileBasenameNoExtension}", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", "setupCommands": [ { "description": "为 gdb 启用整齐打印", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "AMD64编译调试", "miDebuggerPath": "/usr/bin/gdb" }, { "name": "AMD64编译运行", "type": "cppdbg", "request": "launch", "program": "${fileDirname}/${fileBasenameNoExtension}", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", "setupCommands": [ { "description": "为 gdb 启用整齐打印", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "AMD64编译运行", "miDebuggerPath": "/usr/bin/gdb" } ] }
客制化
下面推荐我认为比较舒适的配置和一些好用的插件
-
字体字号:推荐使用Jetbrains设计的JetBrain Mono,十分舒适
-
界面:安装Better C++ Syntax插件,使用原生的黑色界面
-
插件:Hex Editor、hexdump for vscode,另外,可以考虑一下The Better Syntax Megapack