在VSCode中写简单的C++程序

前言

毕业后终于有了一点空闲时间,可以来继续倒腾倒腾自己的电脑了。自然想起了微软大爷的一堆东西,便想先搞搞VSCode试试。
事出有因,作为一个编程小白,以前写程序都是用微软各版本的航母VisualStudio,虽说性能分析、语法纠错什么的蛮好用,但还是想再试着配置一下轻量级的编辑器,以为能加深自己对程序实现过程的理解吧。年少无知的时候折腾过Vim、Emacs、Atom、Editplus,但都不很如意。一方面是没有坚持下来长时间写程序,导致没有形成自己的习惯;另一方面也是因为平时更经常看用MATLAB,对编程的理解始终感觉不到位。
查到很多个配置方案并一个一个试过后,终于实现了用VSCode写程序的第一步。开始折腾!

准备工作

编译器

关于编译器,据说:
1. 可以选择LLVM、MinGW64、Tdm-gcc等主流编译环境的其中一个。其中LLVM前端(词法、语法分析、语义分析、生成中间代码)使用的是clang,效率上优于后面三个所使用的gcc。(2018.3.)
2. 在 Windows 下安装 Clang 是一件不太愉快的事情,如果在安装时遇到困难,大可放弃安装 Clang ,转而安装 GCC。(2017.8.)
作为小白,尽管看了些讲LLVM和GCC区别的文章,但是并不能很好地体会到两者的区别。也看到很多配置里,将intelliSenseMode改为clang-x64,但是其command设置是g++,仿佛是将LLVM和MinGW64混合起来了一样。暂时没有搞懂,详情再看。
另外我发现,截止目前的LLVM已经将clang更新到6.0.0版本,对于Windows来说安装已经非常友好了。加上本来就安装好的MinGW64,我也打算把这两个都搞出来得了!

  • 编译器下载安装包还是压缩包无所谓,重点是要确认系统环境变量路径中有**\LLVM\bin**\MinGW64\bin这两个。个人感觉安装包似乎好管理一些。

工具插件

  1. 下载好VSCode自然是必不可少的!直接在官网下载即可,支持开源。
  2. 也一定要下载好大家都说到的Microsoft官网的插件C/C++
  3. 以及其他非必要的、凭个人喜好下载的插件,如C/C++ Clang Command AdapterVSCode Great Icons等。

方案

  • 听说了各种都能配置好的方案,我挑了其中相当简单的一种自己实现了出来。没有什么Makefile跨平台这类高级操作,完全依赖 VS Code内置工具实现工作环境配置。
  • 依下面顺序进行各个配置文件的更改。如果复制进文件保存时候报错,去掉中文注释内容即可。

c_cpp_properties.json 配置

  • 在这个配置文件中,目前猜测主要确定了C++调用头文件的位置,其他功能还需细看发现。有些方案中,看到这里除了Win32之外还有Ubuntumac等名称,暂且按下不提。
    {
    "configurations": [
        {
            "name": "Win32",
            "intelliSenseMode": "clang-x64",
            // 此处设置包含系统环境路径
            "includePath": [
                "/usr/include",
                "/usr/local/include",
                "${workspaceFolder}"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "__GNUC__=7",
                "__cdecl=__attribute__((__cdecl__))"
            ],
            "browse": {
                "path": [
                    "/usr/include",
                    "/usr/local/include",
                    "${workspaceFolder}"
                ]
            },
            "limitSymbolsToIncludedHeaders": true,
            "databaseFilename": "",
            // 此处设置编译器路径,应将其更改为自己的g++.exe所在路径
            "compilerPath": "E:/Environment/MinGW64/bin/g++.exe",
            "cStandard": "c11",
            "cppStandard": "c++17"
        }
    ],
    "version": 4
}

tasks.json配置

  • tasks是在F1的命令行中键入Tasks: Run Task后生成的模板中更改的。据不成熟的理解,这个文件限定了当前文件执行任务的过程和属性。
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Compile",
            "command": "g++",
            "args": [
                "-g",//指定编译源代码文件
                "${file}",
                "-o",// 指定输出文件名,不加该参数则默认输出a.exe
                "${fileDirname}/${fileBasenameNoExtension}.exe",
                "-ggdb3",   // 生成和调试有关的信息
                "-Wall",    // 开启额外警告
                "-static-libgcc",   // 静态链接
                "-Wno-format",
                "-finput-charset=UTF-8",//输入编译器文本编码 默认为UTF-8
                "-fexec-charset=GBK"//编译器输出文本编码 自行选择 
            ],

            "type": "shell",

            "group": {
                "kind": "build",
                "isDefault": true
            },

            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": false,
                "panel": "shared"
            },
            "problemMatcher": {
                "owner": "cpp",
                "fileLocation": [
                    "relative","\\"
                ],
                "pattern":{
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        }
    ]
}

launch.json配置

  • launch似乎是在按下F5时“运行”的文件。刚开始每次编译运行都要通过F1打开的命令行中运行task,然后才可以用F5和Ctrl+F5运行编译生成的exe文件。有了”preLaunchTask”之后,就可以直接与tasks中的各项任务相绑定,大大减小了编译时耗费的心力和时间。
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "C++ Launch (GDB)", // 配置名称,将会在启动配置的下拉菜单中显示
            "type": "cppdbg", // 配置类型,这里只能为cppdbg
            "request": "launch", // 请求配置类型,可以为launch(启动)或attach(附加)
            "targetArchitecture": "x64", // 生成目标架构,一般为x86或x64
            "program": "${fileDirname}/${fileBasenameNoExtension}.exe", // 将要进行调试的程序的路径
            "args": [], // 程序调试时传递给程序的命令行参数,一般设为空即可
            "stopAtEntry": false, // 设为true时程序将暂停在程序入口处,一般设置为false
            "cwd": "${workspaceRoot}", // 调试程序时的工作目录,一般为${workspaceRoot}
            "externalConsole": true, // 调试时是否显示控制台窗口,一般设置为true显示控制台
            "internalConsoleOptions": "neverOpen", // 如果不设为neverOpen,调试时会跳到“调试控制台”选项卡",
            "MIMode": "gdb", // 指定连接的调试器
            "miDebuggerPath": "E:/Environment/MinGW64/bin/gdb.exe", // 调试器路径
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for GDB",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": false
                }
            ],
            // 此处设置按下F5调用的tasks.json中的任务标签label
            "preLaunchTask": "Compile"
        }
    ]
}

settings.json配置

  • 这个好像随意配置……我也把我改的一些放上来吧。
  • 原理是从默认配置中复制相关设置到用户设置空间并覆盖默认设置,这个设定感觉相当棒!不会清除默认配置,又可以实现用户自定义配置。以这种形式实现我倒是第一次发现。
{
    "workbench.colorTheme": "Hopscotch",
    "atomKeymap.promptV3Features": true,
    "editor.multiCursorModifier": "ctrlCmd",
    "editor.fontSize": 16,
    "files.associations": {
        "*.json": "jsonc",
        "*.cfg": "ini",
        "*.fsh": "glsl",
        "stack": "cpp",
        "iostream": "cpp",
        "ostream": "cpp",
        "*.tcc": "cpp",
        "cctype": "cpp",
        "clocale": "cpp",
        "cmath": "cpp",
        "cstdint": "cpp",
        "cstdio": "cpp",
        "cstdlib": "cpp",
        "cwchar": "cpp",
        "cwctype": "cpp",
        "exception": "cpp",
        "initializer_list": "cpp",
        "iosfwd": "cpp",
        "istream": "cpp",
        "limits": "cpp",
        "new": "cpp",
        "stdexcept": "cpp",
        "streambuf": "cpp",
        "system_error": "cpp",
        "type_traits": "cpp",
        "typeinfo": "cpp",
        "utility": "cpp"
    },
    "editor.snippetSuggestions": "top",
    "C_Cpp.clang_format_sortIncludes": true,
    "editor.wordWrap": "on",
    "editor.formatOnPaste": true,
    "editor.formatOnType": true,
}

其他

  1. 以上四个json文件在.vscode文件夹内,由VSCode软件自动生成,似乎每次新建的时候都需要重新设置。因此我的打算是建立一个文件夹,先用一个测试案例将配置文件设置好,然后就在这个文件夹内写以后的很多小程序,省去了每次都要打开这些文件复制到新文件的配置文件里的麻烦。
  2. 我就是在C++配置文件中设置"intelliSenseMode": "clang-x64",在tasks配置文件中设置"command": "g++",目前并不知道这样做会有什么后果。

总结

  • 更多详细内容,且听下回分晓。工地上事情马上就要多起来了,希望能有集中的时间再玩下去。
  • 本文暂时只实现了VSCode中编译C++程序的最简单配置,能够运行书上的各种练习程序。
  • 今日时间不够,下次再说碰到的各种问题。

你可能感兴趣的:(学习)