0. 前言

VS Code 是微软发布一款跨平台的源代码编辑器,其拥有强大的功能和丰富的扩展,使之能适合编写许多语言。

本文面向初学者(但不是纯小白),分享一点我配置C/C++的经验。

本文所有内容均可从VS Code的官方文档:C++ programming with Visual Studio Code 以及各个扩展的文档中获得,并且他们还会进行更新。

我的环境:64位Windows 10。VS Code的配置文件在Linux下应该也是通用的,但需要修改路径等部位配置。

1. 环境的准备

VS Code的官网和下载、安装最新的版本。VS Code只是一个编辑器,并不是IDE(集成开发环境)。不含编译器(和许多其它功能),所以编译器要自己安装好。如果想用其他工具链或单纯用官方扩展。

然后下载安装MinGW-w64,其实MinGW和MinGW-w64只是名字像,它们是两个不同的项目。为了方便,本文中的MinGW指的其实都是MinGW-w64。MinGW本身已经很久没有更新了,故不推荐。下载以下两个程序(都要):

下载好了以后安装。添加环境变量时:选Add LLVM to the system PATH for all users(即第二项,不过第三项也差不多)。Clang的安装路径(Destination folder)我推荐填C:\Program Files\LLVM,不装那里也行,下面的配置里路径就自己改。安装完了以后可能会弹出cmd说MSVC integration install failed。这个是因为Clang默认使用的是msvc的工具链,而我们选择的工具链是MinGW,所以就不用管这个提示

MinGW随便装哪,Architecture选x86_64,装好以后把东西全部复制到Clang的文件夹里去,他们会无冲突合并。同样,不做这一步也行,下面的配置里路径就自己改,还要手动把MinGW的bin文件夹加到path中,因为MinGW不会自己加。至于为什么既要装Clang又要装MinGW,是因为Clang没有头文件。然后就可以把MinGW删了(Uninstall.exe)。不建议安装多个MinGW,如果你安装了其他IDE需要注意把其他的MinGW从环境变量中去掉;也可以自己把他们的编译器设为Clang。因为几乎所有的轻量级IDE用的都是MinGW或TDM-GCC,它们不制造编译器,只是打包了一个。而且它们用在VSC里也会有奇怪的错误。

运行cmd,输clang,应该会提示no input files而不是“不是内部命令或外部命令”或者“无法将“clang”项识别为 cmdlet、函数、脚本文件或可运行程序的名称”。输clang -v或gcc -v可以显示出各自的版本。如果是“不是内部命令或外部命令”,说明clang.exe在的文件夹(我的是C:\Program Files\LLVM\bin)没有在环境变量中,要加到path里才行。

配置环境变量

下面我们来配置系统环境
在我的电脑上右键点击属性,然后依次点击下面图片的操作,将MinGW中的bin文件夹路径添加进去(我的路径为 D:\Program Files\MinGW\bin)
之后一直点击确定即可
[注]:设置完系统环境变量之后需要重启vs code

需要安装的扩展:

  • C/C++(就是有些教程里的cpptools)
  • C/C++ Clang Command Adapter:提供静态检测(Lint),很重要
  • Code Runner:右键即可编译运行单文件,很方便

其他可选扩展:

  • Bracket Pair Colorizer:彩虹花括号
  • Include Autocomplete:提供头文件名字的补全
  • C/C++ Snippets:Snippets即重用代码块,效果自己百度;这个扩展安装量虽高,不过个人感觉用处实在不大,你也可以选择其他的Snippets扩展甚至自己定义
  • One Dark Pro:大概是VS Code安装量最高的主题
  • vscode-clangd:这个和Adapter二选一,出得比Adapter晚,下载量也低,但却是llvm官方出的。出现问题时可以换着试试

不建议/不需要装的扩展:

  • GBKtoUTF8:把GBK编码的文档转换成UTF8编码的。此扩展可能有严重的bug,参见第6点,总之不建议装
  • C++ Intellisense:用的是gtags,本文第一个版本的选择。效果非常非常一般。
  • C/C++ Advanced Lint:即cppflylint,本文第二个版本的选择。会产生许多奇怪的警告。总之“过时”了
  • Clang-Format:Adapter包含了此功能

2. 配置四个.json文件

先创建一个你打算存放代码的文件夹(称作工作区),路径不能含有中文和空格和引号。c语言和c++需要建立不同的工作区(除非你懂得下面json文件的某些选项,则可以做到一个工作区使用不同的build task)。

打开VS Code,选打开文件夹(不要选“添加工作区文件夹”,理由见上一句),选择刚才那个文件夹,点VS Code上的新建文件夹,名称为.vscode(这样做的原因是Windows的Explorer不允许创建的文件夹第一个字符是点),然后创建 launch.json,tasks.json,settings.json,c_cpp_properties.json放到.vscode文件夹下,效果图:

 

launch.json代码:

stopAtEntry可根据自己喜好修改;cwd可以控制程序运行时的相对路径,如有需要可以改为${fileDirname}。其他无需更改,除非你不用windows,则可以用lldb调试(需要自己装)。type和request不变色是正常现象。

 1 // https://github.com/Microsoft/vscode-cpptools/blob/master/launch.md
2 {
3 "version": "0.2.0",
4 "configurations": [
5 {
6 "name": "(gdb) Launch", // 配置名称,将会在启动配置的下拉菜单中显示
7 "type": "cppdbg", // 配置类型,这里只能为cppdbg
8 "request": "launch", // 请求配置类型,可以为launch(启动)或attach(附加)
9 "program": "${fileDirname}/${fileBasenameNoExtension}.exe", // 将要进行调试的程序的路径
10 "args": [], // 程序调试时传递给程序的命令行参数,一般设为空即可
11 "stopAtEntry": true, // 设为true时程序将暂停在程序入口处,我一般设置为true
12 "cwd": "${workspaceFolder}", // 调试程序时的工作目录
13 "environment": [], // (环境变量?)
14 "externalConsole": true, // 调试时是否显示控制台窗口,一般设置为true显示控制台
15 "internalConsoleOptions": "neverOpen", // 如果不设为neverOpen,调试时会跳到“调试控制台”选项卡,你应该不需要对gdb手动输命令吧?
16 "MIMode": "gdb", // 指定连接的调试器,可以为gdb或lldb。但目前lldb在windows下没有预编译好的版本。
17 "miDebuggerPath": "gdb.exe", // 调试器路径。
18 "setupCommands": [
19 {
20 "description": "Enable pretty-printing for gdb",
21 "text": "-enable-pretty-printing",
22 "ignoreFailures": false
23 }
24 ],
25 "preLaunchTask": "Compile" // 调试会话开始前执行的任务,一般为编译程序。与tasks.json的label相对应
26 }
27 ]
28 }

tasks.json代码:

reveal可根据自己喜好修改,即使设为never,也只是编译时不跳转到“终端”而已,手动点进去还是可以看到,我个人设为never。

命令行参数方面,-std根据自己的需要修改。如果使用Clang编写C语言,把command的值改成clang。

如果使用MinGW,编译C用gcc,编译c++用g++,并把-target和-fcolor那两条删去。如果不想要额外警告,把-Wall那一条删去。

参数的作用我加了注释,还看不懂,百度gcc使用教程。

 1 // https://code.visualstudio.com/docs/editor/tasks
2 {
3 "version": "2.0.0",
4 "tasks": [
5 {
6 "label": "Compile", // 任务名称,与launch.json的preLaunchTask相对应
7 "command": "clang++", // 要使用的编译器
8 "args": [
9 "${file}",
10 "-o", // 指定输出文件名,不加该参数则默认输出a.exe
11 "${fileDirname}/${fileBasenameNoExtension}.exe",
12 "-g", // 生成和调试有关的信息
13 "-Wall", // 开启额外警告
14 "-static-libgcc", // 静态链接
15 "-fcolor-diagnostics",
16 "--target=x86_64-w64-mingw", // 默认target为msvc,不加这一条就会找不到头文件
17 "-std=c++17" // C语言最新标准为c11,或根据自己的需要进行修改
18 ], // 编译命令参数
19 "type": "shell",
20 "group": {
21 "kind": "build",
22 "isDefault": true // 设为false可做到一个tasks.json配置多个编译指令,需要自己修改本文件,我这里不多提
23 },
24 "presentation": {
25 "echo": true,
26 "reveal": "always", // 在“终端”中显示编译信息的策略,可以为always,silent,never。具体参见VSC的文档
27 "focus": false, // 设为true后可以使执行task时焦点聚集在终端,但对编译c和c++来说,设为true没有意义
28 "panel": "shared" // 不同的文件的编译信息共享一个终端面板
29 }
30 // "problemMatcher":"$gcc" // 如果你不使用clang,去掉前面的注释符,并在上一条之后加个逗号。照着我的教程做的不需要改(也可以把这行删去)
31 }
32 ]
33 }

settings.json代码:

把这个文件里的东西放到“用户设置”里也可以覆盖全局设置,自己进行选择。

Code Runner的命令行和某些选项可以根据自己的需要在此处修改,用法还是参见此扩展的文档和百度gcc使用教程。

如果你要使用其他地方的头文件和库文件,可能要往clang.cflags和clang.cxxflags里加-I和-L,用法百度gcc使用教程。

clang的补全,在我过去的测试过程中会让VSC非常卡,但是现在好像没有这个问题了。

如果你卡,就把clang的补全关掉,用cpptools的。

Linux下去掉code runner和flags的--target那一条,共四个。

{
"files.defaultLanguage": "cpp", // ctrl+N新建文件后默认的语言
"editor.formatOnType": true, // 输入时就进行格式化,默认触发字符较少,分号可以触发
"editor.snippetSuggestions": "top", // snippets代码优先显示补全
</span><span style="color: #800000">"</span><span style="color: #800000">code-runner.runInTerminal</span><span style="color: #800000">"</span>: <span style="color: #0000ff">true</span>, //<span style="color: #000000"> 设置成false会在“输出”中输出,无法输入
</span><span style="color: #800000">"</span><span style="color: #800000">code-runner.executorMap</span><span style="color: #800000">"</span><span style="color: #000000">: {
</span><span style="color: #800000">"</span><span style="color: #800000">c</span><span style="color: #800000">"</span>: <span style="color: #800000">"</span><span style="color: #800000">cd $dir &amp;&amp; clang $fileName -o $fileNameWithoutExt.exe -Wall -g -Og -static-libgcc -fcolor-diagnostics --target=x86_64-w64-mingw -std=c11 &amp;&amp; $dir$fileNameWithoutExt</span><span style="color: #800000">"</span><span style="color: #000000">,
</span><span style="color: #800000">"</span><span style="color: #800000">cpp</span><span style="color: #800000">"</span>: <span style="color: #800000">"</span><span style="color: #800000">cd $dir &amp;&amp; clang++ $fileName -o $fileNameWithoutExt.exe -Wall -g -Og -static-libgcc -fcolor-diagnostics --target=x86_64-w64-mingw -std=c++17 &amp;&amp; $dir$fileNameWithoutExt</span><span style="color: #800000">"</span><span style="color: #000000">
}, </span>//<span style="color: #000000"> 设置code runner的命令行
</span><span style="color: #800000">"</span><span style="color: #800000">code-runner.saveFileBeforeRun</span><span style="color: #800000">"</span>: <span style="color: #0000ff">true</span>, //<span style="color: #000000"> run code前保存
</span><span style="color: #800000">"</span><span style="color: #800000">code-runner.preserveFocus</span><span style="color: #800000">"</span>: <span style="color: #0000ff">true</span>, //<span style="color: #000000"> 若为false,run code后光标会聚焦到终端上。如果需要频繁输入数据可设为false
</span><span style="color: #800000">"</span><span style="color: #800000">code-runner.clearPreviousOutput</span><span style="color: #800000">"</span>: <span style="color: #0000ff">false</span>, //<span style="color: #000000"> 每次run code前清空属于code runner的终端消息 </span><span style="color: #800000">"</span><span style="color: #800000">C_Cpp.clang_format_sortIncludes</span><span style="color: #800000">"</span>: <span style="color: #0000ff">true</span>, //<span style="color: #000000"> 格式化时调整include的顺序(按字母排序)
</span><span style="color: #800000">"</span><span style="color: #800000">C_Cpp.intelliSenseEngine</span><span style="color: #800000">"</span>: <span style="color: #800000">"</span><span style="color: #800000">Default</span><span style="color: #800000">"</span>, //<span style="color: #000000"> 可以为Default或Tag Parser,后者较老,功能较简单。具体差别参考cpptools扩展文档
</span><span style="color: #800000">"</span><span style="color: #800000">C_Cpp.errorSquiggles</span><span style="color: #800000">"</span>: <span style="color: #800000">"</span><span style="color: #800000">Disabled</span><span style="color: #800000">"</span>, //<span style="color: #000000"> 因为有clang的lint,所以关掉
</span><span style="color: #800000">"</span><span style="color: #800000">C_Cpp.autocomplete</span><span style="color: #800000">"</span>: <span style="color: #800000">"</span><span style="color: #800000">Disabled</span><span style="color: #800000">"</span>, //<span style="color: #000000"> 因为有clang的补全,所以关掉 </span><span style="color: #800000">"</span><span style="color: #800000">clang.cflags</span><span style="color: #800000">"</span>: [ //<span style="color: #000000"> 控制c语言静态检测的参数
</span><span style="color: #800000">"</span><span style="color: #800000">--target=x86_64-w64-mingw</span><span style="color: #800000">"</span><span style="color: #000000">,
</span><span style="color: #800000">"</span><span style="color: #800000">-std=c11</span><span style="color: #800000">"</span><span style="color: #000000">,
</span><span style="color: #800000">"</span><span style="color: #800000">-Wall</span><span style="color: #800000">"</span><span style="color: #000000">
],
</span><span style="color: #800000">"</span><span style="color: #800000">clang.cxxflags</span><span style="color: #800000">"</span>: [ // 控制c++<span style="color: #000000">静态检测时的参数
</span><span style="color: #800000">"</span><span style="color: #800000">--target=x86_64-w64-mingw</span><span style="color: #800000">"</span><span style="color: #000000">,
</span><span style="color: #800000">"</span><span style="color: #800000">-std=c++17</span><span style="color: #800000">"</span><span style="color: #000000">,
</span><span style="color: #800000">"</span><span style="color: #800000">-Wall</span><span style="color: #800000">"</span><span style="color: #000000">
],
</span><span style="color: #800000">"</span><span style="color: #800000">clang.completion.enable</span><span style="color: #800000">"</span>:<span style="color: #0000ff">true</span> //<span style="color: #000000"> 效果效果比cpptools要好

}

c_cpp_properties.json代码:

此文件内容来自于Microsoft/vscode-cpptools;这个json不允许有注释(其实按照标准本来就不能有)。

如果你没有合并Clang和MinGW,则该文件中的compilerPath必需修改成MinGW的完整路径,精确到gcc.exe,否则会提示找不到头文件;Linux下应该是/usr/bin/gcc。

如果你自己编写了头文件又不在workspaceFolder下,路径也要加到includePath和browse里。这些路径是否递归有效暂时未知,我的测试是有效的。

Windows下的路径为反斜杠,原本应使用两个反斜杠来转义,但直接用斜杠在VS Code中也接受。

{
"configurations": [
{
"name": "MinGW",
"intelliSenseMode": "clang-x64",
"compilerPath": "C:/Program Files/LLVM/bin/gcc.exe",
"includePath": [
"${workspaceFolder}"
],
"defines": [],
"browse": {
"path": [
"${workspaceFolder}"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
},
"cStandard": "c11",
"cppStandard": "c++17"
}
],
"version": 4
}

为什么要往json里写这么多的东西?因为VSC本身并没有对C语言特别优待,对其他许多语言也是这样。另外稍微提一下,以$开头的是VSC预定义的变量,具体参见:Variables Reference

关于VS Code输出会出现乱码,很多人都遇到过。这是因为VS Code内部用的是utf-8编码,cmd/powershell是gbk编码。直接编译,会把“你好”输出成“浣犲ソ”。
其实可以点右下角 选Reopen with Encoding 选Chinese GBK 就可以正常输入中文了,而且输出也是正常的
还可以在设置里搜索encode,把files.encoding改成gbk,而且最好把files.autoGuessEncoding也改成true

本文主要在作者:谭九鼎 (链接)的基础上简化。

 

Visual Studio Code 如何编写运行 C、C++ 程序?的更多相关文章

  1. Visual Studio Code如何编写运行C、C++

    Visual Studio Code如何编写运行C.C++ 作者:知乎用户链接:https://www.zhihu.com/question/30315894/answer/154979413来源:知 ...

  2. visual studio code 里调试运行 Python代码

    最近对微软的visual studio code 挺感兴趣的,微软的跨平台开发工具.轻量简洁. 版本迭代的也挺快的,截止16年8月2日已经1.3.1版本了,功能也愈加完善.(16年12月18日 已经, ...

  3. Visual Studio Code 中编写 C++ 的工作流

    1. 官网下载 Visual Studio Code ,安装.按提示安装 cpp 插件和 cmake 插件. 官网下载 CMake ,安装. 官网下载 Mingw ,安装. 安装 Mingw 时,注意 ...

  4. 如何用Visual Studio Code远程调试运行在服务器上的nodejs应用

    假设我有一个nodejs应用,运行在AWS - 亚马逊云平台上(Amazone Web Service).我想用本地的Visual Studio Code来远程调试服务器端的nodejs应用. Vis ...

  5. ASP.NET Core 中文文档 第二章 指南(1)用 Visual Studio Code 在 macOS 上创建首个 ASP.NET Core 应用程序

    原文:Your First ASP.NET Core Application on a Mac Using Visual Studio Code 作者:Daniel Roth.Steve Smith ...

  6. 使用Visual Studio Code搭建TypeScript开发环境

    使用Visual Studio Code搭建TypeScript开发环境 1.TypeScript是干什么的 ? TypeScript是由微软Anders Hejlsberg(安德斯·海尔斯伯格,也是 ...

  7. 【实验手册】使用Visual Studio Code 开发.NET Core应用程序

    .NET Core with Visual Studio Code 目录 概述... 2 先决条件... 2 练习1: 安装和配置.NET Core以及Visual Studio Code 扩展... ...

  8. 使用Visual Studio Code开发.NET Core看这篇就够了

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9926078.html 在本文中,我将带着大家一步一步的通过图文的形式来演示如何在Visual Studi ...

  9. Visual Studio Code(VS code)你们都在用吗?或许你们需要看一下这篇博文

    写在前面 在前端开发中,有一个非常好用的工具,Visual Studio Code,简称VS code. 都不用我安利VS code,大家就会乖乖的去用,无数个大言不惭的攻城狮,都被VS code比德 ...

随机推荐

  1. 2018软工实践—Alpha冲刺(8)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 多次测试软件运行 学习OPENMP ...

  2. Alpha 冲刺(6/10)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 测试服务器并行能力 学习MSI.CUDA ...

  3. HDU 2012 FZU 1756关于素数的一些水题

    HDU 2012 素数判定 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  4. mysql不能启动报error2013错误的解决办法

    Mysql mysql lost connection to server during query 问题解决方法 2013-10-16 11:10:53 缘由: 在查询Mysql中的数据库,或者修改 ...

  5. C语言之goto浅析

    1.  读代码时遇了的疑惑点: static int do_bind(const char *host, int port, int protocol, int *family) { int fd; ...

  6. QSet使用及Qt自定义类型使用QHash等算法

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QSet使用及Qt自定义类型使用QHash等算法     本文地址:http://techie ...

  7. linux自启动、定时启动脚本

    linux开机自启动 想让一个程序.脚本开机自启动,可以在/etc/rc.d目录下面找到rc.local文件,编辑该文件,在尾部加上需要运行的命令即可. 如: #cd /etc/rc.d #sudo ...

  8. Linux下objdump查看C程序编译后的汇编代码

    http://m.blog.csdn.net/article/details?id=47747047 Uboot中start.S源码的指令级的详尽解析 http://www.crifan.com/fi ...

  9. shell脚本中调用其他脚本的三种方法

    方法一:使用 .     #. ./sub.sh 方法二:使用 source    #source ./sub.sh 方法三:使用 sh    #sh ./sub.sh 注意: 1.两个点之间,要有空 ...

  10. 第196天:js---调用函数的五种方式

    一.普通方式 /*普通模式*/ // 声明一个函数,并调用 function func() { console.log("Hello World"); } func(); 二.函数 ...