工具使用 vscode 编写c/c++

工具使用 vscode 编写c/c++

越行勤 867 2021-11-03

引言

vscode 是一个强大的文本编辑器,但是很难说它是一个好用的IDE,新手很不适合这个,但是学习了这么久,其实我就喜欢vscode 轻量便捷和高度自定义.倘若让我使用复杂的IDE,我并不是很乐意,消耗的性能很大,而且学习成本很高,功能大而复杂,轻量化的vscode ,我就很喜欢。但是如果你想驾驭vscode去写c/c++的话,我并不建议新手去使用,因为你需要掌握 GCC/Clang 或则其他编译器的使用,而且要熟悉vscode配置文件,这对于一个新手的话,难度还是太大了,但是经过不断的摸爬滚打,我可以给你说vscode的配置其实一点都不难。

vscode 配置

如何去了解如何陪配置vscode呢,查看官方文档是不错的方法,传送门:https://code.visualstudio.com/docs

很可惜他是英文的,但是不要紧,我的三脚猫水平还是能驾驭的。我们先看设置的一些配置吧

vscode 配置文件为json文件,所以需要你了解基本语法

本文使用简单易懂的语言去解释一下,.vscode下的三个文件

  1. setting.json
  2. tasks.json
  3. launch.json

setting

文档位置 https://code.visualstudio.com/docs/getstarted/settings

setting.json 其实在vscode有两个,第一个是在 C:\Users\<用户名>\AppData\Roaming\Code\User 路径下,他是全局的,还有一个就在你当前工作目录下的 .vscode目录下是局部的。

既然是json文件,那么所有属性都写在一个{}内,一般格式为

{
    "键":"值",
    "键":"值",
}

有很多键,这里需要遵循 vsode的配置规则,但是我们无需掌握那么多,我们只需要掌握一个非常关键的配置files.encoding ,该配置就是当前工作目录下的默认字符编码,vscode默认是utf8,可惜很多时候我们在中文环境写程序而使用的gbk,这里我们可以在局部设置中 加上这一个键值对,就告诉vscode,我们的字符集为gbk

"files.encoding": "gbk", //字符集

其他的配置,大伙可以自行去查阅,我就不一一列举了哈。

vscode 自带变量

参考文档 https://code.visualstudio.com/docs/editor/variables-reference

vscode 为了方便大伙快速配置,定义了许多默认变量,我们可以在json文件使用它,使用语法和bash中的变量很类似如 ${变量},下面罗列常用的变量

${workspaceFolder} :表示当前workspace文件夹路径,也即/home/Coding/Test

${workspaceRootFolderName}:表示workspace的文件夹名,也即Test

${file}:文件自身的绝对路径,也即/home/Coding/Test/.vscode/tasks.json

${relativeFile}:文件在workspace中的路径,也即.vscode/tasks.json

${fileBasenameNoExtension}:当前文件的文件名,不带后缀,也即tasks

${fileBasename}:当前文件的文件名,tasks.json

${fileDirname}:文件所在的文件夹路径,也即/home/Coding/Test/.vscode

${fileExtname}:当前文件的后缀,也即.json

${lineNumber}:当前文件光标所在的行号

${env:PATH}:系统中的环境变量

有了这些变量,配置起来确实方便多了

tasks.json

该配置文件就是配置一个任务,它可以帮你直接将你自定的命令键入到控制台中,我们可以我们需要的编程环境配置不同的命令来帮我们做一些事情,我们可以指定:

  1. 任务要做什么 :这里要根据你的需求自己完善了
  2. 任务何时发生:比如编译的时候 ctrl+shift+b ,或者其他快捷的时候 ,或者文件打开的是时候

这里我们往往在tasks中配置一个编译任务(就是 ctrl+shift+b 时启动的任务) ,这里先不说那么复杂的,先看一个简单的案例

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Hello",
            "type": "process", //将args中的变量解析成对应的值
            "command": "echo",
            "args": [
                "hello"
                "${file}",
            ],
            "group": {
                "kind": "build", //build 类型  就是 ctrl+shift+b 默认启动的tast 一般配置为编译 任务
                "isDefault": true
            },
        }
    ]
}

这里我们发现,tasks键的值为一个数组,那么就可以配置很多任务了,的确如此,这里可以更具你的具体需要编译。

这里其实写一个任务让终端帮我们执行 echo hello <你当前打开文件> ,如何获取我当前打开的文件呢,前文有介绍${file} 就可以完成这一点。我将他设置为 build,告诉vscode ,你需要在执行 编译的时候去运行它,我们现在来测试一下。

image-20211103225659508

这里vscode就帮我们执行了对于的命令,如果你需要编译c/c++ ,那么换成对应的GCC命令不是就搞定了吗。

当然还有很多可圈可点的地方,参考文档即可 下面是我摘自原文中对这些tasks数组键值的描述

  • label: The task's label used in the user interface.
  • type: The task's type. For a custom task, this can either be shell or process. If shell is specified, the command is interpreted as a shell command (for example: bash, cmd, or PowerShell). If process is specified, the command is interpreted as a process to execute.
  • command: The actual command to execute.
  • windows: Any Windows specific properties. Will be used instead of the default properties when the command is executed on the Windows operating system.
  • group: Defines to which group the task belongs. In the example, it belongs to the test group. Tasks that belong to the test group can be executed by running Run Test Task from the Command Palette.
  • presentation: Defines how the task output is handled in the user interface. In this example, the Integrated Terminal showing the output is always revealed and a new terminal is created on every task run.
  • options: Override the defaults for cwd (current working directory), env (environment variables), or shell (default shell). Options can be set per task but also globally or per platform. Environment variables configured here can only be referenced from within your task script or process and will not be resolved if they are part of your args, command, or other task attributes.
  • runOptions: Defines when and how a task is run.

launch.json

launch发射的意思,我们配置该文件目的是让vscode知道我们如何去debug, 可以将他理解为 debug的配置文件

这里和tasks大同小异,只不过将 tasks换成了 configurations,具体格式如下,后面再介绍吧

// https://code.visualstudio.com/docs/cpp/launch-json-reference
{
    "version": "0.2.0",
    "configurations": [
        
    ]
}

补充

其实别担心,你在配置的时候。vscode的会自定帮你生成一个,你只需要大致了解一下文档,就可以配置出一个简单的,但是如果涉及到一个复杂的项目需要多文件编写,多种不同的语言编写,这就需要借助 cmake , make工具的帮助了,这一点才是难点。

配置单文件编写c/c++

我们在写letcode或者其他练习程序的时候完全不需要多文件,一个文件一个mian就可以解决问题,我们可以借助 vscode自带的变量实现这个目标。

为了很够有语法提示,我们安装插件

  1. c/c++
  2. Bracket Pair Colorizer 这个插件可以帮我 彩色的显示括号,这样好辩别一点

tasks.json

我指定的编译命令为

clang++ ${file} -o ${fileBasenameNoExtension}.exe -g -std=c++20 

-g是为了后续的调试,使用-std指定标准,大家可以按照需求添加.

根据编译命令,写出如下tasks

这里我编译器并没有直接加入到 path中,所以我指定编译的时候使用的是绝对路径,

//编译
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Compile", // 任务名称,与launch.json的preLaunchTask相对应
            "command": "D:/Software/SDK/msys64/mingw64/bin/clang++.exe", //修改为你的编译器
            "args": [
                "${file}",
                "-o",
                "${fileDirname}/out/${fileBasenameNoExtension}.exe",
                "-g",
                "-std=c++20",
                "-m64", // 设置多少位
                "-Wall", // 开启额外警告
                //"-static-libgcc", // 静态链接libgcc,一般都会加上
                //"-fexec-charset=GBK", //字符集
            ],
            "type": "process", // process是把预定义变量和转义解析后直接全部传给command;
            "group": {
                "kind": "build", //build 类型  就是 ctrl+shift+b 默认启动的tast 一般配置为编译 任务
                "isDefault": true
            },
            "presentation": {
                "echo": true,
                "reveal": "always", // 执行任务时是否跳转到终端面板,
                "focus": false, // 设为true后可以使执行task时焦点聚集在终端,
                "panel": "shared" // 不同的文件的编译信息共享一个终端面板
            }
        },
    ]
}

launch.json

调试c++,我使用的是gdb,配置如下,

//运行 调试
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "gdb", // 配置名称,将会在启动配置的下拉菜单中显示
            "type": "cppdbg",//使用gdb
            "request": "launch",
            "program": "${fileDirname}\\out\\${fileBasenameNoExtension}.exe",
            "args": [], // 程序调试时传递给程序的命令行参数,一般设为空
            "stopAtEntry": false, // 设为true时程序将暂停在程序入口处,相当于在main上打断点
            "cwd": "${workspaceFolder}",
            "environment": [], // 环境变量
            "externalConsole": true, //是否启动一个 新的命令行来显示
            "MIMode": "gdb", // 指定连接的调试器
            "miDebuggerPath": "D:\\Software\\SDK\\msys64\\mingw64\\bin\\gdb.exe", // 调试器路径
            "setupCommands": [
                { //可以更好地显示STL容器的内容
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": false
                }
            ],
            "preLaunchTask": "Compile" // 调试前执行的任务,一般为编译程序。与tasks.json的label相对应
        },
    ]
}

很可惜 gdb不持支中文, 所以无法调试带中文的文件,如果你的源文件带中文,那是调试不了的。

这里值得注意的是setupCommands,我们使用gdb调试的时候,发现stl容器显示是这样的

image-20211103233422182

这个vector简直没法看,这个问题困扰了我很久,导致我放弃了 vscode写c++,今天仔细阅读文档的时候发现加入可以让stl显示正常。

            "setupCommands": [
                { //可以更好地显示STL容器的内容
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": false
                }

image-20211103233748741

c_cpp_properties.json

这个文件作用为指定第三方库文件的,如果你没使用第三方库,是可以不用设置的

//包含头文件
{
    "configurations": [
        {
            "name": "LearnC++11/17/20",
            "includePath": [
                "D:/Software/SDK/msys64/mingw64/include/**"
            ], //include 文件
            "compilerPath": "D:/Software/SDK/msys64/mingw64/bin/clang++.exe", //编译器配置
            "cStandard": "c11",
            "cppStandard": "c++20",
            "intelliSenseMode": "windows-clang-x64"
        }
    ],
    "version": 4
}

这里适合单文件编写C,如果你需要多文件的话需要借助make or cmake工具

多个源文件构成的项目配置

这里需要掌握 make知识,其实你也可以无需掌握,有一个插件叫C/C++ Project Generator,可以帮我们一键生成基本环境,我们只需要修改编译器,调试器 路径即可

使用插件

安装完该插件之后,我们按下快捷键 ctrl +shift+p ,输入命令 create c project,一键配置了 makefile和 .vscode.嗯非常nice,当然根据他的配置,我参考了一下,已经不需要借助他来帮我生成了。

image-20211103234946888