Vscode系列—c语言

  • vscode c语言在ubuntu windows下代码提示/补全,简单编译.

  • 更新

    1
    2
    18.03.24 ubuntu下代码提示/补全
    18.10.05 新增win10下配置,补全简单编译.更新版本

导语

  • 写嵌入式的c语言太难搞了,受够了盗版 sourceinsight 艰难的代码提示和补全之后,尝试换一款编辑器.
  • 跨平台,支持多种语言,自由度高.
  • vim 和 Emacs 命令行 有一点学习成本.
  • 最后选定了 vscode 业余写点 python 和 java 写写 markdown 博客等等 (看pdf也行…).

环境

  • vscode
  • ubuntu/win10
  • 注意vscode只是编辑器,其他的功能都是通过 插件 + 后端 实现的.

参考:

https://www.zhihu.com/question/30315894
https://code.visualstudio.com/docs/languages/cpp


需求

  • 代码补全 最重要的c语言的结构体补全!!!.
    • 结构体补全曾经深深折磨这我,直到遇到了clang….
    • 顺带着解决了语法检查,clang的语法检查很是好用.
    • 插件: C/C++ Clang Command Adapter
    • auto.png
    • autoa.png
  • 语法检查
    • 常规clang足矣,Cppcheck作为补充.
    • 插件: C/C++ Clang Command Adapter + cppcheck
    • err.png
  • 代码格式化
    • 眼瞅着clang 配套的clang-format .
    • 插件: Clang-Format
  • 函数跳转
    • 微软官方c/c++插件就行了,但官方插件自带代码补全和语法检查,不怎么好,一定要关掉否则会与clang冲突.
    • 插件: C/C++ for Visual Studio Code
    • jump.png

安装

  • 上文书说到,vscode实现编辑器以外的功能都需要插件+后端的形式 so 一般的安装步骤如下:

  • 安装后端,如clang 、cppcheck 等.

  • 安装对应插件

  • 修改配置文件(json格式)

  • 最后针对处理头文件等.

安装clang

  • clang最新的版本为7.0,测试版8.0.这里选择7.0

Ubuntu

  • ubunt自带的clang 3.8版本,这里需要选择7.0版本.

  • 参考 > https://apt.llvm.org/

  • 修改ubuntu源 /etc/apt/source.list 添加llvm官方源

    1
    2
    deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-7 main
    deb-src http://apt.llvm.org/xenial/ llvm-toolchain-xenial-7 main
  • 添加llvm源的 密钥

    1
    2
    wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add -
    # Fingerprint: 6084 F3CF 814B 57C1 CF12 EFD5 15CF 4D18 AF4F 7421
  • 更新软件列表,这样就可以安装7.0版本了

    1
    sudo apt-get update
  • 安装clang7.0

    1
    sudo apt-get install clang-7 lldb-7 lld-7

    或者安装全部llvm root用户下(太多偷个懒)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # LLVM
    # LLVM
    apt-get install libllvm-7-ocaml-dev libllvm7 llvm-7 llvm-7-dev llvm-7-doc llvm-7-examples llvm-7-runtime
    # Clang and co
    apt-get install clang-7 clang-tools-7 clang-7-doc libclang-common-7-dev libclang-7-dev libclang1-7 clang-format-7 python-clang-7
    # libfuzzer
    apt-get install libfuzzer-7-dev
    # lldb
    apt-get install lldb-7
    # lld (linker)
    apt-get install lld-7
    # libc++
    apt-get install libc++-7-dev libc++abi-7-dev
    # OpenMP
    apt-get install libomp-7-dev
  • 完整安装需要良好的网络,llvm大概300M,等下就好.

  • 验证

    • 命令行输入 clang-7.0 不会提示无此命令即可.

win10

  • windows比较复杂一点,llvm的windows版本不带c语言的库文件等需要额外安装MinGW-w64,复制合并库文件.

  • 下载链接

    • LLVM Download Page 下载 Clang 选Pre-Built Binaries中的Clang for Windows (64-bit),不需要下.sig文件.
    • MinGW-w64下载MinGW-w64
  • llvm安装

    • 添加环境变量时:选Add LLVM to the system PATH for all users(即第二项,不过第三项也差不多).
    • Clang的安装路径(Destination folder)以C:\LLVM为例
  • MinGW-w64安装

    • 路径随意.
    • 安装结束后,将MinGW安装目录下所有文件剪贴到 C:\LLVM 下,没有合并错误.
  • 验证

    • 命令行 输入clang -v 输出clang的版本
      • 提示错误,未找到命令.clang.exe在的文件夹C:\LLVM\bin 要加入没有在环境变量中,要加到path.
    • 命令行 输入gcc -v 输出gcc版本

配置

代码补全/语法检查Lint

  • 这里需要插件名 C/C++ Clang Command Adapter,在vscode中搜索下载即可.
    网络环境限制还可以在vscode官网下载vsix格式的文件,离线安装.
  • 安装完成后,进入重头戏,也是初次上手vscode最难适应的地方.

clang插件及配置

  • 进入vscode的设置 setting.json ,分为 用户区设置 和 工作区设置.

    • 用户区设置,是用户自定义全局设置,覆盖vscode默认设置,每个工程都有效.
    • 工作区设置,是针对本工程的个性化设置,只在本工程生效.
    • 简易是将clang等设置 保存在用户区,工作区保存追对 clang 的头文件设置.
  • 用户区设置

    • Ubuntu

      1
      "clang.executable": "clang-7.0"
    • win10

      1
      "clang.executable": "clang"
      • clang.executable : 后端clang的路径,默认是”clang”. 而ubuntu 是 clang-7.0 ,也可以写入 clang 的安装目录.
        win10不写也可以.
  • 工作区设置

    • ubuntu

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      "clang.cflags": [// 控制c语言静态检测的参数
      "-std=c99",//c99兼容老项目,新项目直接c11
      "-Wall",
      "-I${cwd}",//头文件路径,一定要写全,否则一直会有错误提示.
      "-I/usr/include",
      "-I/usr/include/c++/5",
      "-I/usr/include/x86_64-linux-gnu/c++/5",
      "-I/usr/include/c++/5/backward",
      "-I/usr/lib/gcc/x86_64-linux-gnu/5/include",
      "-I/usr/local/include",
      "-I/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed",
      "-I/usr/include/x86_64-linux-gnu",
      "-I/usr/include",
      "-I${workspaceRoot}",
      "-I${workspaceRoot}/Include",
      "-I${workspaceRoot}/Libs/Cjson/Include"
      ],
      "clang.completion.enable": true,//自动补全
      "clang.completion.triggerChars": [//触发代码补全的输入常用的 . : >.
      ".",
      ":",
      ">"],
    • win10

      1
      2
      3
      4
      5
      6
      "clang.cflags": [ // 控制c语言静态检测的参数
      "--target=x86_64-w64-mingw",//Clang默认是msvc工具链,这里是MinGW
      "-std=c11",
      "-Wall"
      ],
      "clang.completion.enable": true,
  • 保存后,代码补全/语法检查 全部如上图所示.

编译检查

  • 一般clang自带满足要求,有需要再加上 cppcheck (仅ubuntu)

安装cppcheck

  • 我没有追求最新,直接通过ubuntu官方源安装

    1
    sudo apt-get install cppcheck
  • 安装完成,执行 cppcheck 命令,不提示无此命令即可.

cppcheck插件及配置

  • 搜索安装 cppcheck

  • 同样配置分为用户区和工作区.工作区对应头文件设置.

  • 用户区

    1
    2
    3
    4
    5
    "cppcheck.cppcheckPath": null,
    "cppcheck.standard": [
    "c99",
    ],
    "cppcheck.language": "c",
    • cppcheck.cppcheckPath : null时,会使用 cppcheck 命令指向的版本,也可以使用自定义路径.
    • cppcheck.standard : cppcheck 检查时 c/c++版本,历史原因我这里还是 c99.
    • cppcheck.language : 前置检查时 以 c 或者 c++ 检查.我这里都是 c 项目,填写 c .
  • 工作区

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    "cppcheck.includePaths": [
    "${cwd}",
    "/usr/include",
    "/usr/include/c++/5",
    "/usr/include/x86_64-linux-gnu/c++/5",
    "/usr/include/c++/5/backward",
    "/usr/lib/gcc/x86_64-linux-gnu/5/include",
    "/usr/local/include",
    "/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed",
    "/usr/include/x86_64-linux-gnu",
    "/usr/include",
    "${workspaceRoot}",
    "${workspaceRoot}/Include",
    "${workspaceRoot}/Code/APP/Code/Libs/Cjson/Include"
    ],
    "cppcheck.force": true
    • cppcheck.includePaths : 头文件路径,这里没有 -I ,直接输入路径即可.支持直接和间接路径.
    • cppcheck.force : 强制检查所有枚举所有可能配置,有多个项目同时在工作,这里我放到工作区了,如果代码量小的工程建议放在用户区,作为全局配置.

使用

  • 左下角,点击cppcheck 如图
    cppcheck.png

  • 3个选择

    • 分析当前打开文件
    • 分析工作区所有文件
    • 其他…没用过..

函数跳转

  • 直接使用微软的 C/C++ for Visual Studio Code 即可.
  • 官方的很强大,带代码补全和语法检查,,可惜表现不太好.函数跳转很好用.

C/C++ 配置

  • 搜索安装 C/C++ for Visual Studio Code

  • 不用安装后端了,对应的配置就稍微麻烦了.

  • 在项目根目录下 查找 .vscode文件夹,进入.应该由 setting.json文件,对应工作区设置.

  • 新建c_cpp_properties.json ,写入配置内容.

    • Ubuntu

      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
      {
      "configurations": [
      {
      "name": "Linux",
      "includePath": [
      "/usr/include/c++/5",
      "/usr/include/x86_64-linux-gnu/c++/5",
      "/usr/include/c++/5/backward",
      "/usr/lib/gcc/x86_64-linux-gnu/5/include",
      "/usr/local/include",
      "/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed",
      "/usr/include/x86_64-linux-gnu",
      "/usr/include",
      "${workspaceRoot}",
      "${workspaceRoot}/Include"
      ],
      "defines": [],
      "intelliSenseMode": "clang-x64",
      "browse": {
      "path": [
      "/usr/include/c++/5",
      "/usr/include/x86_64-linux-gnu/c++/5",
      "/usr/include/c++/5/backward",
      "/usr/lib/gcc/x86_64-linux-gnu/5/include",
      "/usr/local/include",
      "/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed",
      "/usr/include/x86_64-linux-gnu",
      "/usr/include",
      "${workspaceRoot}",
      "${workspaceRoot}/Include"
      ],
      "limitSymbolsToIncludedHeaders": true,
      "databaseFilename": ""
      }
      }
      ],
      "version": 3
      }
    • win10

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      {
      "configurations": [
      {
      "name": "Win32",
      "intelliSenseMode": "clang-x64",
      "compilerPath": "C:/LLVM/bin/gcc.exe",
      "includePath": [
      "${workspaceFolder}",
      "${workspaceFolder}/data structure/Binary tree"
      ],
      "defines": [],
      "browse": {
      "path": [
      "${workspaceFolder}"
      ],
      "limitSymbolsToIncludedHeaders": true,
      "databaseFilename": ""
      },
      "cStandard": "c11",
      "cppStandard": "c++17"
      }
      ],
      "version": 4
      }
  • 将常用头文件路径添加到 includePath"browse"->"path"下.可以不用手工添加,项目文件下,光标 指向提示找不到的 include 头文件 ,会有 💡 提示添加路径到path中,搞定!

  • 至此代码跳转应该可以使用了.

    • ctrl 悬浮提示,点击跳转.还有其他快捷键爽翻天.

特别提醒

  • 上文提到 C/C++ for Visual Studio Code 会与 clang 的代码提示和语法检查冲突,所以一定要记得在用户区设置关闭自带.

  • 工作区设置

    1
    2
    3
    "C_Cpp.autocomplete": "Disabled",//自动补全
    "C_Cpp.errorSquiggles": "Disabled",//错误提示
    "C_Cpp.formatting": "Disabled",//代码格式化

代码格式化

  • 如果不需要太多调整,可以直接使用clang,无需clang-format
  • 这里以clang-format(ubuntu)为例了
  • 使用clang-7.0 配套的 clang-format-7.0即可.
  • clang-format可以通过配置文件控制很多格式化细节.

安装clang-format

  • 进行过 安装clang-7.0 后,执行如下命令即可.

    1
    sudo apt-get install clang-format-7.0
  • ubuntu官方源 为3.8版本,也可以安装使用,最好与clang版本保持一致.

clang-format配置

  • 这里使用配置文件形式详细自定义格式化.(也可以直接使用自带的几种格式,同样够用)

  • 用户区设置

    1
    2
    "clang-format.assumeFilename": ".clang-format",
    "clang-format.executable": "clang-format-7.0",
    • clang-format.assumeFilename : 制定格式化的标准,这里是通过文件 .clang-format 来配置.还可以留空通过clang-format.fallbackStyle指定 LLVM, Google, Chromium, Mozilla, WebKit 之一为格式化标准.
    • clang-format.executable : clang-format路径,这里安装的是 clang-format-7.0.
  • 指定通过.clang-format文件为格式化标准后,在项目根目录下 新建 .clang-format 文件.

  • 每个版本的 clang-format 都有对应的详细定制说明.7.0版本对应说明

  • 官方有几个风格实例:

    • Linux Kernel style

      1
      2
      3
      4
      5
      6
      BasedOnStyle: LLVM
      IndentWidth: 8
      UseTab: Always
      BreakBeforeBraces: Linux
      AllowShortIfStatementsOnASingleLine: false
      IndentCaseLabels: false

      效果如下:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      void test()
      {
      switch (x) {
      case 0:
      case 1:
      do_something();
      break;
      case 2:
      do_something_else();
      break;
      default:
      break;
      }
      if (condition)
      do_something_completely_different();

      if (x == y) {
      q();
      } else if (x > y) {
      w();
      } else {
      r();
      }
      }
    • Visual Studio style

      1
      2
      3
      4
      5
      6
      UseTab: Never
      IndentWidth: 4
      BreakBeforeBraces: Allman
      AllowShortIfStatementsOnASingleLine: false
      IndentCaseLabels: false
      ColumnLimit: 0

      效果如下:

      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
      void test()
      {
      switch (suffix)
      {
      case 0:
      case 1:
      do_something();
      break;
      case 2:
      do_something_else();
      break;
      default:
      break;
      }
      if (condition)
      do_somthing_completely_different();

      if (x == y)
      {
      q();
      }
      else if (x > y)
      {
      w();
      }
      else
      {
      r();
      }
      }
  • 最后是我的自定义配置(中文说明),从网上收集+官方文档.

    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
    # 配置以什么语言format当前文件
    # CPP: C, C++, Objective-C, ObjectiveC++;
    Language: Cpp

    #在llvm的配置基础上加定制配置
    BasedOnStyle: LLVM

    #someLongFunction(argument1,
    # argument2);
    AlignAfterOpenBracket: Align

    # true: 表示对齐连续的紧跟注释(连续行使用双斜杠注释,包括在函数体内),多用于Model定义、property说明、私有成员变量说明;
    AlignTrailingComments: true

    #对齐连续赋值运算符
    AlignConsecutiveAssignments : true

    #若true,则对齐连续声明.
    AlignConsecutiveDeclarations : true

    #换行符选项 左对齐
    AlignEscapedNewlines: Left

    #水平对齐二目运算符和三目运算符的操作数
    AlignOperands : true

    # true:允许较短(一般只有一行,多为内联C函数)的Function在一行显示,如“int f() { return 1; }”,规定设为false;
    AllowShortFunctionsOnASingleLine: false

    #true: 允许较短的if判断在一行显示,否则换行显示(没有自动加花括号);
    AllowShortIfStatementsOnASingleLine: true

    #??? true 允许较短的循环(while、for)在一行显示,否则换行显示(没有自动加花括号);
    AllowShortLoopsOnASingleLine: true

    #true:允许只有Break语句的case标签在一行显示,false:不允许(自动换行显示), 规范为不允许
    AllowShortCaseLabelsOnASingleLine: false

    #true:允许将较长的literal-String字符串分割成多行显示;
    AlwaysBreakBeforeMultilineStrings: false

    BreakBeforeBraces: Allman

    #连续行的缩进长度(通常缩进+设置值), 一般用于首参数小于后续参数的method名字、多行的String-literals
    ContinuationIndentWidth: 4

    #设置代码的最大长度(回自动对代码长度进行换行显示,并对注释自动换行;当长度加大的时候,AllowAllParametersOfDeclarationOnNextLine=true失效)
    ColumnLimit: 100

    #如果为真(true), 分析最常见的格式化文件中“&”和“\*”的对齐方式。pointeralignment则仅作为后备。
    DerivePointerAlignment: true

    #true: 将switch的case标签从switch表达式缩进一级;否则将switch表达式对齐;
    IndentCaseLabels: true

    #缩进字符长度
    IndentWidth: 4

    #所有位置的指针星号(*)或取地址符号(&)对齐位置:Left、Middle、Right,当作为乘号时候居中 (规范为Right)
    PointerAlignment: Right

    #整个文件任意位置最大能够保持的连续空行数(如果超过MAX值,减少到Max行,小于不管;)
    MaxEmptyLinesToKeep: 2

    #true:在赋值运算符之前添加一个空格,否则去掉;(规范为添加)
    SpaceBeforeAssignmentOperators: true

    #是否在括号之前添加一个空格,Never:任何情况都不添加;ControlStatements:只在控制结构(for、if、while)的地方添加空格;AlWays: 除开在function-like的的宏定义之外在任何地方都需要添加空格;(规范为ControlStatements)
    SpaceBeforeParens: ControlStatements

    #在紧跟注释之前所留空格数,一般建议为2个空格
    SpacesBeforeTrailingComments: 2

    UseTab: Never

    # 格式兼容C++11
    Standard: Cpp11

    #当前配置生效开关,true:打开,false:关闭
    DisableFormat: false

编译/调试

  • 这里以win10为例了,ubuntu更为简单,不再赘述.

编译

  • 这里的编译仅仅是小项目的简单使用,更专业的还是要ubuntu下使用 makefile, win10下使用批处理文件.
  • .vscode 文件夹下新建 launch.jsontasks.json

launch.json

  • win下面还是只能使用gdb作为调试器

    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
    {
    // 使用 IntelliSense 了解相关属性。
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
    {
    "name": "Clang(gdb)-alone", // 配置名称,这里是单个c文件调试配置.
    "type": "cppdbg", // 配置类型,这里只能为cppdbg
    "request": "launch", // 请求配置类型,可以为launch(启动)或attach(附加)
    "program": "${fileDirname}/${fileBasenameNoExtension}.exe", // 将要进行调试的程序的路径
    "args": [], // 程序调试时传递给程序的命令行参数,一般设为空即可
    "stopAtEntry": false, // 设为true时程序将暂停在程序入口处,我一般设置为true
    "cwd": "${workspaceFolder}", // 调试程序时的工作目录
    "environment": [], // (环境变量?)
    "externalConsole": true, // 调试时是否显示控制台窗口,一般设置为true显示控制台
    "internalConsoleOptions": "neverOpen", // 如果不设为neverOpen,调试时会跳到“调试控制台”选项卡,你应该不需要对gdb手动输命令吧?
    "MIMode": "gdb", // 指定连接的调试器,可以为gdb或lldb。但目前lldb在windows下没有预编译好的版本。
    "miDebuggerPath": "gdb.exe", // 调试器路径,Windows下后缀不能省略,Linux下则去掉
    "setupCommands": [ // 用处未知,模板如此
    {
    "description": "Enable pretty-printing for gdb",
    "text": "-enable-pretty-printing",
    "ignoreFailures": false
    }
    ],
    "preLaunchTask": "Build-alone" // 调试会话开始前执行的任务,一般为编译程序。与tasks.json的label相对应,这里是编译单个c文件
    },
    {
    "name": "Clang(gdb)-dir", // 配置名称,这里是一个文件夹下仅一个main函数.
    "type": "cppdbg", // 配置类型,这里只能为cppdbg
    "request": "launch", // 请求配置类型,可以为launch(启动)或attach(附加)
    "program": "${fileDirname}/${fileBasenameNoExtension}.exe", // 将要进行调试的程序的路径
    "args": [], // 程序调试时传递给程序的命令行参数,一般设为空即可
    "stopAtEntry": false, // 设为true时程序将暂停在程序入口处,我一般设置为true
    "cwd": "${workspaceFolder}", // 调试程序时的工作目录
    "environment": [], // (环境变量?)
    "externalConsole": true, // 调试时是否显示控制台窗口,一般设置为true显示控制台
    "internalConsoleOptions": "neverOpen", // 如果不设为neverOpen,调试时会跳到“调试控制台”选项卡,你应该不需要对gdb手动输命令吧?
    "MIMode": "gdb", // 指定连接的调试器,可以为gdb或lldb。但目前lldb在windows下没有预编译好的版本。
    "miDebuggerPath": "gdb.exe", // 调试器路径,Windows下后缀不能省略,Linux下则去掉
    "setupCommands": [ // 用处未知,模板如此
    {
    "description": "Enable pretty-printing for gdb",
    "text": "-enable-pretty-printing",
    "ignoreFailures": false
    }
    ],
    "preLaunchTask": "Build-dir" // 调试会话开始前执行的任务,一般为编译程序。与tasks.json的label相对应,这里是编译一个文件夹下仅一个main函数.
    }
    ]
    }

tasks.json

  • 主要是编译等任务配置.

    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
    {
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
    {
    "label": "echo",
    "type": "shell",
    "command": "echo Hello"
    },
    {
    "label": "Build-alone", // 任务名称,与launch.json的preLaunchTask相对应,编译单文件
    "command": "clang", // 要使用的编译器
    "args": [
    "${file}",
    "-o", // 指定输出文件名,不加该参数则默认输出a.exe,Linux下默认a.out
    "${fileDirname}/${fileBasenameNoExtension}.exe",
    "-g", // 生成和调试有关的信息
    "-Wall", // 开启额外警告
    "-static-libgcc", // 静态链接
    "-fcolor-diagnostics", // 彩色的错误信息?但貌似clang默认开启而gcc不接受此参数
    "--target=x86_64-w64-mingw", // clang的默认target为msvc,不加这一条就会找不到头文件;Linux下去掉这一条
    "-std=c11" // C语言最新标准为c11,或根据自己的需要进行修改
    ], // 编译命令参数
    "type": "shell", // 可以为shell或process,前者相当于先打开shell再输入命令,后者是直接运行命令
    "group": {
    "kind": "build",
    "isDefault": true // 设为false可做到一个tasks.json配置多个编译指令,需要自己修改本文件,我这里不多提
    },
    "presentation": {
    "echo": true,
    "reveal": "always", // 在“终端”中显示编译信息的策略,可以为always,silent,never。具体参见VSC的文档
    "focus": false, // 设为true后可以使执行task时焦点聚集在终端,但对编译c和c++来说,设为true没有意义
    "panel": "shared" // 不同的文件的编译信息共享一个终端面板
    }
    },
    {
    "label": "Build-dir", // 任务名称,与launch.json的preLaunchTask相对应,编译文件夹
    "command": "clang", // 要使用的编译器
    "args": [
    "${fileDirname}/*.c",//编译文件夹下所有c文件,so 只能由一个main函数
    "-o", // 指定输出文件名,不加该参数则默认输出a.exe,Linux下默认a.out
    "${fileDirname}/${fileBasenameNoExtension}.exe",
    "-g", // 生成和调试有关的信息
    "-Wall", // 开启额外警告
    "-static-libgcc", // 静态链接
    "-fcolor-diagnostics", // 彩色的错误信息?但貌似clang默认开启而gcc不接受此参数
    "--target=x86_64-w64-mingw", // clang的默认target为msvc,不加这一条就会找不到头文件;Linux下去掉这一条
    "-std=c11" // C语言最新标准为c11,或根据自己的需要进行修改
    ], // 编译命令参数
    "type": "shell", // 可以为shell或process,前者相当于先打开shell再输入命令,后者是直接运行命令
    "group": {
    "kind": "build",
    "isDefault": true // 设为false可做到一个tasks.json配置多个编译指令,需要自己修改本文件,我这里不多提
    },
    "presentation": {
    "echo": true,
    "reveal": "always", // 在“终端”中显示编译信息的策略,可以为always,silent,never。具体参见VSC的文档
    "focus": false, // 设为true后可以使执行task时焦点聚集在终端,但对编译c和c++来说,设为true没有意义
    "panel": "shared" // 不同的文件的编译信息共享一个终端面板
    }
    }
    ]
    }

调试

  • ctrl+shift+B单纯编译,按F5为运行并调试.不要把f5当作编译来使用,有的bug只产生警告,不会阻止编译,但越早期解决越好.
  • 进入调试
    gdb调试.jpg

结语

  • 至此,vscode 编写c语言的体验就十分完整了.跨平台一致化的体验真的很好.推荐还在苦恼 c 编辑器的可以一试,只是非常麻烦.到底vscode开始还是为前端准备的.
  • 下一篇vscode的 python 配置(已完成).