用vscode写C/C++

声明

系统:Arch Linux
vscode 版本:1.28.2
gcc 版本:8.2.1
gdb 版本:8.2
C/C++插件 版本:0.20.1

本文所说方法在上述系统以及软件中试验成功,对其他系统不一定完全适用但有一定的借鉴价值,部分系统中的设置本文中也会提及。如有疑问,欢迎评论。
本文部分内容参考vscode官方文档,vscode github,C/C++插件github

1.安装vscode

MacOS Windows 以及部分Linux可以直接上vscode官网下载安装包
Linux还可以使用包管理工具(archlinux的pacman或yay,Ubuntu的apt)安装

2.安装插件

打开vscode后界面如下图所示,选择左侧状态栏最后一个(就那个像四个正方形的)或者按快捷键(Ctrl+Shift+X)即可进入插件界面。
用vscode写C/C++_第1张图片

Chinese (Simplified) Language Pack for Visual Studio Code

修改语言为中文,当然了,也可以直接用英文,这样碰到什么问题直接Google很方便
用vscode写C/C++_第2张图片

C/C++

一个几乎是写C/C++必备的插件,提供智能提示、语法查错、debugger功能,本文围绕它展开
用vscode写C/C++_第3张图片

Code Runner

一个能编译运行绝大多数语言的插件,省去了敲命令的过程,可以做到一键编译运行大部分代码(环境配好的前提下)
安装过程与前两个类似

3.编译和运行代码

终端编译

懂得如何在终端下使用gcc的,可以直接在vscode中打开终端(快捷键Ctrl+`),用gcc进行编译

配置tasks.json,设置快捷键

首先在当前目录下新建一个文件夹.vscode,这个文件夹主要就是存你对vscode在当前文件夹的配置。
在.vscode中新建一个文件tasks.json,然后将以下内容复制进tasks.json。(windows用户有一处需要修改(有许多感叹号的地方))

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {//配置任务 compile cpp file with O2
            "label": "compile cpp file with O2",//任务名称
            "type": "shell",//运行在终端
            "group": {//任务所属执行组
                "kind": "build",
                /*
                可选
                build:生成组
                test:测试组
                由于这里要编译代码 所以选择生成组
                */
                "isDefault": true
                //是否时默认生成任务,选择是,这样可以直接使用快捷键Ctrl+Shift+B执行任务
            },
            "command": "g++",//执行命令,由于是编译所以选择g++
            "args": [
                "${file}",//需要编译的任务名称
                "-o${fileBasenameNoExtension}",
                //生成文件的名称
//!!!!!!!!!//windows应改为"-o${fileBasenameNoExtension}"
                "-g",//使生成文件可以调试
                "-lstdc++",//链接
                "-lm",//链接
                "-std=gnu++11",//使用c++11标准
                "-Wfatal-errors",//出现error就退出
                "-O2"//开启O2优化
            ],
            //以上为必要设置
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": false,
                "panel": "shared",
                "showReuseMessage": true
            },
            "problemMatcher": {
                "owner": "cpp",
                "fileLocation": [
                    "relative",
                    "${workspaceFolder}"
                ],
                "pattern": {
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            },
            "promptOnClose": true
        },
        //和上一个相同,只是取消了O2优化(不然的话debug的时候会发生错误)
        {
            "label": "compile cpp file before debug",
            "command":"g++",
            "args": [
                "${file}",
                "-o${fileBasenameNoExtension}",
                "-g",
                "-lstdc++",
                "-lm",
                "-std=gnu++11",
                "-Wfatal-errors",                
            ],
            "type": "shell",
            "group": "build",
            "presentation": {
                "echo": false,
                "reveal": "silent",
                "focus": false,
                "panel": "shared",
                "showReuseMessage": false
            },
            "promptOnClose": true,
            "problemMatcher": {
                "owner": "cpp",
                "fileLocation": [
                    "relative",
                    "${workspaceFolder}"
                ],
                "pattern": {
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        },
        //运行代码
        {
            "group": {
                "kind": "test",
                "isDefault": true
            },
            "label": "run the file",
            "command":"${fileDirname}/${fileBasenameNoExtension}",
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": false,
                "panel": "shared",
                "showReuseMessage": true
            },
            "dependsOn":"compile cpp file with O2"
        }
    ]
}

然后就是设置快捷键
使用快捷键(Ctrl+K Ctrl+S)打开如下界面
用vscode写C/C++_第4张图片
然后点击 打开keybindings.json ,在打开的界面中填入以下内容

// Place your key bindings in this file to overwrite the defaults
[
    {//设置不在调试阶段使用F10设断点,因为原来使用F9设置断点的
        "key": "F10",
        "when": "!inDebugMode",
        "command":"editor.debug.action.toggleBreakpoint"
    },
    {//设置F9调用默认
        "key": "F9",
        "when":"!inDebugMode",
        "command":"workbench.action.tasks.test"
    }
]

这样我们就设置了F9一键编译运行代码

友情提示:在vscode中编译运行代码之前请先保存代码,否则代码修改无效

4.调试代码

vscode为使用者做好了一个调试的界面以及各种按钮,然后插件的作者写出一个插件调用系统中已有的调试器(C/C++插件具有这种功能),三者共同调试你的程序。用通俗一点的话说就是你面对者那一堆前进、运行的箭头,每按一个按钮,vscode就告诉插件我要调试器做什么,然后插件就根据不同的调试器翻译成不同的命令给调试器,然后调试器就指挥者你的程序进行下一步。
要完成这一套流程,需要配置好launch.json文件

配置launch.json文件

将以下目录复制进.vscode下的launch.json文件中
macos用户有注意点(许多感叹号处)

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",//名称 显示在调试窗口上
            "type": "cppdbg",//配置 由插件提供
            "request": "launch",//配置类型 可选择启动或附加
            "args": [],//启动调试器时额外配置的参数
            "stopAtEntry": true,//是否选择在程序入口暂停 由于我一直忘记设置断点所以我选择是
            "cwd": "${fileDirname}",//工作目录
            "environment": [],
            "preLaunchTask": "compile cpp file before debug",//在调试前运行的task 编译
            "MIMode": "gdb",//使用的调试模式 由于我是Linux 所以选择gdb
//!!!!!!!!!!//注意 Windows用户设置为gdb MacOS用户设置为lldb
            "linux": {
                "program": "${fileDirname}/${fileBasenameNoExtension}",
                //程序目录+名称
                "miDebuggerPath": "/usr/bin/gdb",
                //调试器目录,非必要 如不写则调用插件目录下的一个gdb
            },
            "windows": {
                "program": "${fileDirname}\\${fileBasenameNoExtension}.exe"
                //程序目录+名称
                //"miDebuggerPath": "",//应修改为gdb的目录
                //调试器目录,非必要 如不写则调用插件目录下的一个gdb
            },
            "osx": {
                "program": "${fileDirname}/${fileBasenameNoExtension}",
                //程序目录+名称
                "miDebuggerPath": "/usr/bin/lldb-mi",
                //调试器目录,非必要 如不写则调用插件目录下的一个lldb-mi 
                //注意此处不能写lldb 因为lldb没有mi模式
            },
            "setupCommands": [
                {//增加对STL的输出支持 仅限gdb7以上的版本
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

具体操作界面见下图
用vscode写C/C++_第5张图片


关于我遇到的一些问题以及解决办法(持续更新)

使用gdb调试时右下角出现无法打开文件

更新时间:2018.11.10
情况描述:使用step in时总是进入库函数(如printf),然后右下角弹窗 无法打开文件 file///build/。。。
具体情况截图:
用vscode写C/C++_第6张图片
就是右下角这个,让人看起来觉得很烦,而且就卡在那边了
解决方法:在终端中输入 sudo strip /usr/lib/libstdc++.so.6.0.25
具体文件版本可能不同,但是就是那个libstdc++.so文件

Linux下我想用lldb可以吗

更新时间:2018.11.10
可以,但是会碰见一些问题,主要就是无法输入(至少是我无法解决,如果有大神知道怎么解决,请评论一下,谢谢)
替代方案:在代码中使用重定向输入

你可能感兴趣的:(折腾系统)