2022/5/17:新版教程已发布,点此查看。

2022/5/17:新版教程已发布,点此查看。

2022/5/17:新版教程已发布,点此查看。

2022/2/4:本文章不再予以更新


-1- 前言

①目的

我于 2021 年 4 月末 5 月初正式开始学习 C++,前几月一直使用 VSCode + GCC + GDB + Git 进行学习,翻阅韩骏老师的《Visual Studio Code 权威指南》时,发现他在 C++ 栏目里推荐了名为「vscode-clangd」的插件(已改名为clangd)。

后配置相关插件时遇到诸多问题,查阅不少文章、文档,经几天才配置满意。想到可能有同道会遇到同样的问题,故而写下本文章。

文章主旨是初学 C++ 的人简易地配置出一个满意的编程环境,不会有 CMake、Git 等的详细教程。我认为这就像婴儿学步一样:婴儿练习的是跑步,经历多次跌倒后很快便学会了走路,借助学步车的反而学得很慢。

——我想提供的是「助跑器」,而不是「学步车」。

由于仅从今年4月开始学习,会存在很多疏漏和不够专业的地方,还望海涵。

②与按照官方文档配置好的 VSCode 相比拥有的优势

  • 代码拥有更加丰富的颜色。我利用 VSCode Default Dark+ 主题自带的代码颜色的互补色、相近色,为「类型参数」、「成员函数」、「成员变量」、「函数参数」等与「类」、「自动变量」的颜色作了区分。

代码拥有更加丰富的颜色
  • 相对更加精准的「功能」、「转到定义」、「重命名符号」等功能。
  • Clang-Tidy提供了强大的「静态检查」支持,并对于部分代码提供「快速修复」。具体请见Clang-Tidy Checks。这里我主要添加了对于「Google 开源项目风格指南(有中文版,但翻译版本滞后,需注意)」「Cpp Core Guidelines」和性能、潜在的bug、移植性、现代C++的检查。

静态检查
  • 自动添加头文件。对于建议中的项会即时自动添加头文件,导航条会自动下移(观察行号)隐藏添加的头文件。

自动添加头文件
  • 利用「Git」进行版本管理。
  • 通过「CMake」实现项目管理。

③未解决的问题

  • 用 LLDB 调试时,无法正确跳转到「系统头文件」而显示为「未知源」,使用 GDB 调试同一个文件则没有此问题。尝试过「vscode-lldb 在 GitHub 的 Issues 中给出的静态链接相关库」和「Clang 编译器用户手册中给出的将 -g 改为 -glldb」等方法,最终无果。

-1- 安装

①安装 VSCode

通过官方网站获取

下载安装包并安装即可,略。

下载慢?请参考《VSCode官网下载缓慢或下载失败的解决办法》

这里给出 x86_64 1.60.0 版本的下载链接。

②安装 MSYS2

通过官方网站获取

下载安装包并安装即可,略。

下载慢?通过清华大学开源软件镜像站获取

进入清华大学开源软件镜像站,点击右侧的「获取下载链接」,切换到「应用软件」即可找到。

清华大学开源软件镜像站

③安装 Git

通过官方网站获取

下载安装包并安装即可,略。

下载慢?通过清华大学开源软件镜像站获取

进入清华大学开源软件镜像站,点击右侧的「获取下载链接」,切换到「应用软件」即可找到。

安装时,切换 Git 的默认编辑器为 VSCode。

切换 Git 的默认编辑器为 VSCode

④配置环境变量

右键「开始」菜单,选择「系统」,在「系统」中点击「高级系统设置」,选择「环境变量(N)...」,在上方的「用户变量」或下方的「系统变量」,找到「Path」并选中编辑。

如果得到的是图一样式,在原「变量值」尾部加入英语输入法下的分号「;」后,加入「MSYS2 安装路径\clang64\bin」(默认为 C:\msys64\clang64\bin)。

图一

如果得到的是图二样式,点击「新建」,并输入「MSYS2 安装路径\clang64\bin」(默认为 C:\msys64\clang64\bin)即可。

图二

同样的我们也可以把C:\msys64\mingw64\bin加入其中,但我并没有用上。

⑤利用 MSYS2 安装「Clang」「CMake」「Git」等软件

通过「开始」菜单,或路径(默认为 C:\msys64 )打开「MSYS2.exe」

以下是会用到的指令:

pacman -Syu    // 更新整个系统
pacman -Su    // 更新已安装的包
pacman -Ss 关键字    // 搜索含关键字的包
pacman -S 包名    // 安装包,也可以同时安装多个包,只需以空格分隔包名即可
pacman -Rs 包名    // 删除包及其依赖
pacman -R 包名    // 删除包

比如《C++程序设计:原理与实践》一书中提到 FLTK 库。输入「pacman -Ss fltk」进行搜索,会查找到众多包名。由于使用的是clang64,所以需要安装以clang64/开头的「mingw-w64-clang-x86_64-fltk」。可以通过右键进行复制,接着输入「pacman -S mingw-w64-clang-x86_64-fltk」即可安装。

pacman -Ss fltk

这里我直接列出需要执行的指令:

pacman -S mingw-w64-clang-x86_64-toolchain mingw-w64-clang-x86_64-cninja mingw-w64-clang-x86_64-python-six mingw-w64-clang-x86_64-python-pip
pip install cmake_format
pacman -Syu
pacman -Syu

题外话:笔者最近使用 cpan 安装 Perl 模块时发现,需要使用的是 Clang64.exe,来安装对应 perl 的模块,而非 msys2.exe.

⑥在 VSCode 中安装需要的插件

打开「VSCode」点击左边栏上方最后一项「Extensions」以进行插件安装,必需的插件请见快速安装我所推荐插件。

当然,我们也可以搜索「Chinese」安装汉化界面插件,后面的表述也会用汉化后的界面,更多插件请见「-4-(可选)我所使用的VSCode插件」。

快速安装我所推荐插件

用「VSCode」打开一个文件夹,在该文件夹中新建名为「.vscode」的文件夹,在其中新建全名为「extensions.json」的文件,并在其中加入如下代码。

{"recommendations": ["jeff-hykin.better-cpp-syntax","danielpinto8zz6.c-cpp-project-generator","twxs.cmake","ms-vscode.cmake-tools","guyutongxue.cpp-reference","llvm-vs-code-extensions.vscode-clangd","ms-vscode.cpptools","cheshirekow.cmake-format"]
}

如图所示

extensions.json

同样的,由左边栏进入「Extensions」,在搜索框中输入「@recommended」,即可得到我所推荐的插件。(然而还是只能一个一个点击安装)

注意:

  • 先安装「C/C++」再安装「clangd」安装完成后,会提示发生冲突(见下图),请选择「Disable IntelliSense」。
  • MSYS2 中安装的 clangd 存在一定问题,请在 VSCode 中通过「Ctrl + Shift + P」打开命令菜单,输入 clangd 并 选择「clangd: Download language server」安装插件提供的版本。

输入「@recommended」

冲突

-2- 配置配置文件

「VSCode」界面下,点击左下角的齿轮,选择「设置」,我们可以通过切换「用户」/「工作区」等,决定是为整个软件还是为单个工作区更改设置。

在右上角点击「打开设置」,可以切换到设置对应的 「settings.json」 文件。

这里我倾向于将尽量多的设置置于 VSCode 的配置文件中,以便于用账号同步设置,没有给 Clangd 等单独新建配置文件。

设置界面

如果阅读了安装插件并按照注意进行了操作,那么在 settings.json 中已经存在以下配置(路径可能不同):

{"clangd.path": "c:\\Users\\FeignClaims\\AppData\\Roaming\\Code\\User\\globalStorage\\llvm-vs-code-extensions.vscode-clangd\\install\\12.0.1\\clangd_12.0.1\\bin\\clangd.exe","C_Cpp.intelliSenseEngine": "Disabled"
}

我们可以看到,配置行之间以英语输入法下的逗号「,」间隔,整个配置文件之外还会有一对大花括号,我们可以将鼠标停在"clangd.path"上,以查看配置说明

针对"clangd.path"一项,你也可以使用 「MSYS2 安装路径\\clang64\\bin\\clangd.exe」。

接下来我将贴出我的各插件及 VSCode 的部分配置及注释(注意添加逗号),你可以选择性地后附到自己的 settings.json 中。

我所使用的通用插件和 C/C++ 插件及其配置请见 -4-(可选)我所使用的VSCode插件-5-(可选)我所使用的VSCode配置。

VSCode

  /*********** VSCode ***********/"editor.unicodeHighlight.ambiguousCharacters": false,// 控制是否应在调试控制台中输入时接受建议; enter 还用于评估调试控制台中键入的任何内容"debug.console.acceptSuggestionOnEnter": "on",// 控制何时打开内部调试控制台"debug.internalConsoleOptions": "neverOpen",// 不允许 Enter 键处理输入时建议,避免换行与接受建议间的歧义// 你也可以允许该项,使用 Ctrl + Enter 进行换行"editor.acceptSuggestionOnEnter": "off",// 控制编辑器应当自动改写左引号或右引号"editor.autoClosingOvertype": "always",// 禁用自动检测文件缩进模式和缩进大小,即打开文件后自动将文件更改为 VSCode 配置的缩进格式"editor.detectIndentation": false,// 粘贴时格式化文件"editor.formatOnPaste": true,// 保存时格式化文件"editor.formatOnSave": true,// 在编辑器中自动显示内联建议"editor.inlineSuggest.enabled": true,// 是否在输入时显示含有参数文档和类型信息的小面板"editor.parameterHints.enabled": true,// 控制是否在键入代码时自动显示建议"editor.quickSuggestions": {// 键入注释时不允许"comments": false,// 键入其他时允许"other": true,// 键入字符串时不允许"strings": false},// 控制显示快速建议前的等待时间(毫秒)"editor.quickSuggestionsDelay": 0,// 控制编辑器在空白字符上显示符号的方式"editor.renderWhitespace": "none",// 代码片段建议置于其他建议之下"editor.snippetSuggestions": "bottom",// 使用空格缩进时模拟制表符的行为,可以方便对齐"editor.stickyTabStops": true,// 建议的接受方式"editor.suggest.insertMode": "replace",// 控制排序时是否提高靠近光标的词语的优先级"editor.suggest.localityBonus": true,"editor.suggest.shareSuggestSelections": true,// 控制建议小部件底部的状态栏可见"editor.suggest.showStatusBar": true,// 控制在键入触发字符后是否自动显示建议"editor.suggestOnTriggerCharacters": true,// 始终预先选择第一个建议"editor.suggestSelection": "first",// 一个制表符 = 2个空格"editor.tabSize": 2,// 控制是否根据文档中的文字提供建议列表"editor.wordBasedSuggestions": true,// 把文件删除时无需确认"explorer.confirmDelete": false,// 移动文件时无需确认"explorer.confirmDragAndDrop": false,// 粘贴同名文件时的重命名方式// smart: 在重复名称末尾智能地添加/递增数字"explorer.incrementalNaming": "smart",// 忽略扩展建议的通知"extensions.ignoreRecommendations": true,// 自动保存"files.autoSave": "afterDelay",// 自动保存的等待时间(毫秒)"files.autoSaveDelay": 1000,// 配置排除的文件和文件夹的glob模式// 文件资源管理器将根据此设置决定要显示或隐藏的文件和文件夹"files.exclude": {"**/.classpath": true,"**/.factorypath": true,"**/.project": true,"**/.settings": true},// 在会话间记住未保存的文件,以允许在退出编辑器时跳过保存提示// onExitAndWindowClose: 退出或窗口关闭时"files.hotExit": "onExitAndWindowClose",// Grunt 任务自动检测"grunt.autoDetect": "on",// Gulp 任务自动检测"gulp.autoDetect": "on",// 应该在何处显示单元格工具栏,或是否隐藏它"notebook.cellToolbarLocation": {// 默认: 右边"default": "right",// jupyter-notebook: 左边"jupyter-notebook": "left"},// 控制单元格编辑器中行号的显示"notebook.lineNumbers": "on",// 配置在搜索中排除的文件和文件夹的glob模式"search.exclude": {// "someFolder/": true,// "somefile": true},// 显示搜索结果所在行号"search.showLineNumbers": true,// 当搜索词为小写时,则不区分大小写进行搜索// 否则区分大小写"search.smartCase": true,// 集成终端默认为 PowerShell"terminal.integrated.defaultProfile.windows": "PowerShell",// 集成终端启用视觉化铃声"terminal.integrated.enableBell": true,// 集成终端编码: zh_CN.UTF-8"terminal.integrated.env.windows": {"LC_ALL": "zh_CN.UTF-8"},// 集成终端使用GPU加速"terminal.integrated.gpuAcceleration": "on",// 集成终端设置"terminal.integrated.profiles.windows": {"Command Prompt": {"args": [],"icon": "terminal-cmd","path": ["${env:windir}\\Sysnative\\cmd.exe","${env:windir}\\System32\\cmd.exe"]},"Git Bash": {"source": "Git Bash"},"Msys2": {"args": ["-defterm", "-no-start", "-here"],"env": {"CHERE_INVOKING": "1","MSYS2_PATH_TYPE": "inherit","MSYSTEM": "CLANG64"},"path": ["C:\\msys64\\msys2_shell.cmd"]},"PowerShell": {"icon": "terminal-powershell","source": "PowerShell"}},// 集成终端右击时选择光标下方的字词,并打开上下文菜单"terminal.integrated.rightClickBehavior": "selectWord","vsintellicode.modify.editor.suggestSelection": "automaticallyOverrodeDefaultValue",// 文件图标主题: 插件 vscode-icons"workbench.iconTheme": "vscode-icons",// 在没有从上一个会话恢复出信息的情况下,在启动时不打开编辑器"workbench.startupEditor": "none",// 显示视图头部的操作项"workbench.view.alwaysShowHeaderActions": true,"editor.largeFileOptimizations": false,"window.zoomLevel": 1

Clangd

  /*********** Clangd ***********/// 关闭 C/C++ 提供的 IntelliSenseEngine"C_Cpp.intelliSenseEngine": "Disabled",// Clangd 运行参数(在终端/命令行输入 clangd --help-list-hidden 可查看更多)"clangd.onConfigChanged": "restart","clangd.arguments": [// 启用 Clang-Tidy 以提供「静态检查」"--clang-tidy",// compelie_commands.json 文件的目录位置(相对于工作区,由于 CMake 生成的该文件默认在 build 文件夹中,故设置为 build)"--compile-commands-dir=build",// 建议风格:打包(重载函数只会给出一个建议);反可以设置为detailed"--completion-style=bundled",/*** Read user and project configuration from YAML files.* Project config is from a .clangd file in the project directory.* User config is from clangd/config.yaml in the following directories:*     Windows: %USERPROFILE%\AppData\Local*     Mac OS: ~/Library/Preferences/*     Others: $XDG_CONFIG_HOME, usually ~/.config** 我所使用的配置:* Diagnostics:*   ClangTidy:*     Add: ["*"]*     Remove:*       [*         abseil*,*         altera*,*         fuchsia*,*         llvmlib*,*         zircon*,*         google-readability-todo,*         readability-braces-around-statements,*         hicpp-braces-around-statements,*       ]* Index:*   Background: Build*/"--enable-config",// 默认格式化风格: 谷歌开源项目代码指南(可用的有 LLVM, Google, Chromium, Mozilla, Webkit, Microsoft, GNU 等)"--fallback-style=Google",// 启用这项时,补全函数时,将会给参数提供占位符,键入后按 Tab 可以切换到下一占位符,乃至函数末// 我选择禁用"--function-arg-placeholders=false",// 输入建议中,已包含头文件的项与还未包含头文件的项会以圆点加以区分"--header-insertion-decorators",// 允许补充头文件"--header-insertion=iwyu",// 让 Clangd 生成更详细的日志"--log=verbose",// pch优化的位置(memory 或 disk,选择memory会增加内存开销,但会提升性能)"--pch-storage=memory",// 输出的 JSON 文件更美观"--pretty",// 建议排序模型"--ranking-model=heuristics",// 同时开启的任务数量"-j=12"],// 自动检测 clangd 更新"clangd.checkUpdates": true,"clangd.path": "C:\\msys64\\clang64\\bin\\clangd.exe",// clangd的snippets有很多的跳转点,不用这个就必须手动触发Intellisense了"editor.suggest.snippetsPreventQuickSuggestions": false,

2021/10/20: 升级到「Clangd 13.0.0」后,「--clang-tidy-checks=<string>」已被废弃,请添加参数「--enable-config」,并在「%USERPROFILE%\AppData\Local\clangd」处创建文件「config.YAML」,并保存以下信息:

Diagnostics:ClangTidy:Add: ["*"]Remove:[abseil*,fuchsia*,llvmlib*,zircon*,altera*,google-readability-todo,readability-braces-around-statements,hicpp-braces-around-statements,modernize-use-trailing-return-type,]
Index:Background: Build

CMake

  /********** CMake **********/// 保存 cmake.sourceDirectory 或 CMakeLists.txt 内容时,不自动配置 CMake 项目目录"cmake.configureOnEdit": false,// 在 CMake 项目目录打开时自动对其进行配置"cmake.configureOnOpen": true,// 成功配置后,将 compile_commands.json 复制到此位置"cmake.copyCompileCommands": "",

LLDB(详见 vscode-lldb 用户手册)

  /********* LLDB *********/// LLDB 指令自动补全"lldb.commandCompletions": true,// LLDB 指针显示解引用内容"lldb.dereferencePointers": true,// LLDB 鼠标悬停在变量上时预览变量值"lldb.evaluateForHovers": true,// LLDB 监视表达式的默认类型"lldb.launch.expressions": "simple",// LLDB 不显示汇编代码"lldb.showDisassembly": "never",// LLDB 生成更详细的日志"lldb.verboseLogging": true,

Git

  /******** Git ********/// 自动从当前 Git 存储库的默认远程库提取提交"git.autofetch": true,// 同步 Git 存储库前确认"git.confirmSync": false,// 没有暂存的更改时,直接提交全部更改"git.enableSmartCommit": true,

(可选)Fira Code 连字体及界面

效果图:

首先,我们需要安装 Fira Code 字体。

然后配置如下:

  /********* Font *********/// 输出窗口"[Log]": {// 字体大小"editor.fontSize": 15},// CodeLens的字体系列: Fira Code Retina"editor.codeLensFontFamily": "Fira Code Retina",// 字体系列: Fira Code Retina"editor.fontFamily": "Fira Code Retina",// 启用连字体"editor.fontLigatures": true,// 字体大小"editor.fontSize": 16,// 集成终端字体大小"terminal.integrated.fontSize": 14,

(可选)多彩代码

  /********** Color **********/// 控制是否对括号着色"editor.bracketPairColorization.enabled": true,// 启用括号指导线"editor.guides.bracketPairs": true,// 语义高亮"editor.semanticHighlighting.enabled": true,// 语义高亮自定义"editor.semanticTokenColorCustomizations": {"enabled": true,"rules": {// 抽象符号"*.abstract": {"fontStyle": "italic"},// 只读量等效为宏"readonly": "#4FC1FF",// 静态量(静态变量,静态函数)"*.static": {"fontStyle": "bold"},// 宏"macro": {// "foreground": "#8F5DAF""foreground": "#4FC1FF"},// 成员函数"method": {"fontStyle": "underline"},// 命名空间"namespace": {"foreground": "#00D780"},// 函数参数"parameter": {"foreground": "#C8ECFF"},// 只读的函数参数"parameter.readonly": {"foreground": "#7BD1FF"},// 成员变量,似乎需要clangd12以上"property": {"fontStyle": "underline","foreground": "#C8ECFF"},// 类型参数"typeParameter": "#31A567",// 未启用的宏"comment": "#767BA6"}},// 括号颜色"workbench.colorCustomizations": {"[Default Dark+]": {"editorBracketHighlight.foreground3": "#9CDCFE","editorBracketHighlight.foreground4": "#F3FD00","editorBracketHighlight.foreground5": "#F47D9F","editorBracketHighlight.foreground6": "#A5ADFE"}},

-3- 建立一个C++专用学习文件夹

还没完!如果我们现在编写一个 .cpp 文件,会发现连系统头文件都查找不了,原因在于我们没有告诉 Clangd 我们的编译器是什么,会有什么参数——更别提系统头文件路径了!

当然我们可以打开「设置」,在「Clangd: Fallback Flags」一项里告诉 Clangd 未找到「compile_commands.json」时编译器的默认参数应该是什么。

——但这样做无法成功让 Clangd 分析多文件项目。

我会在用 CMake 支撑框架一节介绍如何用 CMake 生成 compile_commands.json。

①建立文件结构

思路来自VSCode 配置 C/C++ 终极解决方案:vs code + clang + clangd + lldb (MacOS利用完整 clang-llvm 工具链)。

文件夹命名规范源自 Google 开源项目代码指南,戳此为中文版,但翻译版本滞后,需注意。

当然,未用粗体标出的所有文件/文件夹名都可自定义。

我们在电脑某处新建一个文件夹「code」,专用于编程;在「code」文件夹中新建一个文件夹「cpp」,用于C++编程。

在「VSCode」中选择「文件」-「将文件夹添加到工作区...」,将「cpp」文件夹添加进来,此后我们可以通过「文件」-「工作区另存为...」来保存该工作区以便后序使用以及单独配置、安装插件等。

接下来我们按照自己的需要新建文件夹,比如:

我打算新建一个「practice」文件夹用于学习书上例题、习题,在「practice」内按照再书籍名称、目录细分子文件夹。

同时新建一个「gsl」文件夹,在里面存放「Cpp Core Guidelines」使用的轻量库GSL: Guidelines support library——一个只需包含头文件,无需链接的库。

(这里是为了说明,碰巧这个库在 MSYS2 中无法下载,你也可以下载后把「gsl」文件夹放在「MSYS2 安装路径\clang64\include」里作为「系统头文件」)

接下来我们考虑一件事:如何编译链接、调试代码?

虽然接下来会用 CMake 来管理整个工作区,但我并不打算借助CMake来负责编译链接代码(这也是个一旦入门就很简单的问题),CMake 在这里的作用仅仅是支撑框架、为 Clangd 提供「compile_commands.json」以分析多文件项目。

如果你想要学习如何通过CMake来进行编译、链接,请在看完本文章后,浏览最后的-7- 参考

我们在根目录新建文件夹「.vscode」,在其内新建全名为「tasks.json」(任务)和全名为「launch.json」(调试配置)的文件。

老样子,我会附出代码和对应注释,如果你想真正理解,就需要翻阅更多资料了

tasks.json:

额外的,对于 gsl 库,在参数中加入"-I${workspaceFolder}\\gsl"(-大写的i)(include)

由于 gsl 库只有头文件,故无需再参数中加入"-lgsl"(-小写的L)(link)来链接

{"tasks": [{"type": "shell","label": "Clang++: 编译单文件",// 编译器路径"command": "clang++",// 编译器后附的参数,反映在终端里即"clang+ arg1 arg2 arg3...""args": [// 编译的文件"${fileDirname}\\${fileBasenameNoExtension}.cpp",// 生成文件到 build 文件夹中,文件名为debug.exe"-o","${workspaceFolder}\\build\\test.exe",// 启用调试(debug)"-g",// 启用诊断"-pedantic","-Wall","-Wextra",// 多线程支持"-pthread",// 使用 LLVM lld 链接器而不是默认链接器"-fuse-ld=lld",// 检查内存越界和资源泄露"-fsanitize=address","-fsanitize=undefined",// 分析所有注释(这其实只需告诉 Clangd ,即添加到 compile_commands.json 中)// Clang 默认只分析 Doxygen 风格("/**", "///"开头)的注释// "-fparse-all-comments",// 设置 C++ 的标准库为 libc++: Clang 对应的标准库"-stdlib=libc++",// 设置 C++ 版本为 c++20"-std=c++20",// 为给定环境生成代码"--target=x86_64-w64-mingw"],"options": {// Clang 的启动路径"cwd": "${workspaceFolder}"},"problemMatcher": ["$gcc"],"group": {"kind": "build","isDefault": true},"presentation": {"echo": true,// 执行任务时是否跳转到终端面板,可以为always,silent,never。具体参见VSC的文档,即使设为never,手动点进去还是可以看到"reveal": "always",// 设为true后可以使执行task时焦点聚集在终端,但对编译C/C++来说,设为true没有意义"focus": false,// 不同的文件的编译信息共享一个终端面板"panel": "shared"},"detail": "Clang++: 编译单个文件"},{"type": "shell","label": "Clang++: 编译多文件","command": "clang++","args": ["${fileDirname}\\*.cpp","-o","${workspaceFolder}\\build\\test.exe","-g","-pedantic","-Wall","-Wextra","-pthread","-fuse-ld=lld","-fsanitize=address","-fsanitize=undefined","-stdlib=libc++","-std=c++20","--target=x86_64-w64-mingw"],"options": {"cwd": "${workspaceFolder}"},"problemMatcher": ["$gcc"],"group": {"kind": "build","isDefault": true},"presentation": {"echo": true,"reveal": "always","focus": false,"panel": "shared"},"detail": "Clang++: 编译当前文件所在目录里所有文件"}],"version": "2.0.0"
}

launch.json:

{// 使用 IntelliSense 了解相关属性。// 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [{"name": "LLDB: 生成和调试单文件","type": "lldb","request": "launch","program": "${workspaceFolder}\\build\\test","args": [],"stopOnEntry": false,"cwd": "${fileDirname}","internalConsoleOptions": "neverOpen","environment": [],"externalConsole": false,"setupCommands": [{"text": "settings set target.process.thread.step-avoid-regexp","description": "Enable stepping into STL"},{"text": "settings set target.process.thread.step-avoid-libraries","description": "Avoid stepping into libraries"}],"preLaunchTask": "Clang++: 编译单文件"},{"name": "LLDB: 生成和调试多文件","type": "lldb","request": "launch","program": "${workspaceFolder}\\build\\test","args": [],"stopOnEntry": false,"cwd": "${fileDirname}","internalConsoleOptions": "neverOpen","environment": [],"externalConsole": false,"setupCommands": [{"text": "settings set target.process.thread.step-avoid-regexp","description": "Enable stepping into STL"},{"text": "settings set target.process.thread.step-avoid-libraries","description": "Avoid stepping into libraries"}],"preLaunchTask": "Clang++: 编译多文件"},{"name": "LLDB: 调试已编译的 test.exe","type": "lldb","request": "launch","program": "${workspaceFolder}\\build\\test","args": [],"stopOnEntry": false,"cwd": "${fileDirname}","internalConsoleOptions": "neverOpen","environment": [],"externalConsole": false,"setupCommands": [{"text": "settings set target.process.thread.step-avoid-regexp","description": "Enable stepping into STL"},{"text": "settings set target.process.thread.step-avoid-libraries","description": "Avoid stepping into libraries"}]}]
}

配置好后,你可以点击「终端」-「运行生成任务...」或Ctrl + Shift + B运行任务,这会同注释一样,编译你打开的文件,并输出为工作区根目录下的 debug.exe。

之后(或你可以同时进行),你可以点击「运行」-「启动调试」或 F5 进行调试,要更换调试配置,点击左侧「运行和调试」即可在侧边栏上方更改了。

更多的参数请参考 Visual Studio Code Variables Reference 和 Clang 编译器用户手册。

②用 CMake 支撑框架

在我的理解下,「CMake」的配置是通过在各目录里添加名为「CMakeLists.txt」的文件,并在该文件中定义所在文件夹的信息完成的,所有信息都会被分析后储存在「build」文件夹中,同时生成编译器用以分析文件结构的「compile_commands.json」。

我们本节要做的事,就是借助 CMake 得到 compile_commands.json,以让 Clangd 发挥全部作用。

我们首先在工作区根目录新建一个这样的文件,并保存以下内容。在「CMakeLists.txt」中,注释是以「#」开头的。

#要求 CMake 最低版本
cmake_minimum_required(VERSION 3.0.0)
#工程名称(根目录必须设置工程名称,设置相同工程名的文件将会被视作同一工程)
project(cpp)#添加源外构建,增加 include 的搜索路径(类似于 C++ 添加头文件搜索路径)
set(CMAKE_MODULE_PATH${CMAKE_MODULE_PATH}${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules)
#添加 basicEnv 文件中的内容(类似于 C++ 中的 #include)
include(basic_env)#添加子目录 practice,要求子目录也创建有 CMakeLists.txt
#由于 gsl 目录中只含有头文件,不含有源文件,我们无需添加
add_subdirectory(practice)

正如 6-9 行要求的,我们在工作区根目录下新建文件夹「cmake_modules」,在其中新建全名为「basic_env.cmake」的文件,在这里我们如「tasts.json」一样添加编译器参数。

set(CMAKE_CXX_FLAGS"${CMAKE_CXX_FLAGS} -g -pthread -pedantic -Wall -Wextra -fsanitize=address -fsanitize=undefined -std=c++20 --target=x86_64-w64-mingw"
)

进入「practice」文件夹中。每当我们进入一个文件夹,就询问自己:

这个文件夹里的内容,是属于同一个工程吗?

显然,「practice」文件夹是用于包含我们的读书子目录的,并不算作一个工程。

但基于根目录「CMakeLists.txt」的内容「add_subdirectory(practice)」,我们仍要为其新建一个「CMakeLists.txt」

就像前面说的,「practice」不是一个工程,我们也没必要给它一个工程名称。在「CMakeLists.txt」中我们唯一需要做的,就是通过「add_subdirectory(文件夹名)」将子目录加入 CMake 框架里。

我们已经到达概念上的「工程目录」了。

如果是真正的工程,我们可能需要深入每个目录,一个个添加上「CMakeLists.txt」

但我们只是为了获取「compile_commands.json」而已,而一本书与另一本书的例题、习题代码不太可能发生交互。所以我们在「工程目录」根目录下简单地添加「CMakeLists.txt」,并要求:

  • 这是一个工程
  • 目录里所有的源文件(这里是以 .cc 为后缀名的源文件)都会被编译成工程的执行文件
  • 目录里所有的头文件都可能被包含

例如,对于「c++_primer_plus」工程目录,我要求它的工程名为「c++_primer_plus」:

#工程名称
project(c++_primer_plus)#将所有以 .cpp 为后缀名的源文件添加到变量 src 中
file(GLOB_RECURSE src "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")#添加头文件可能的路径(系统头文件在 Clangd 知道编译器是什么的时候就确定了路径)
include_directories(#根目录的 gsl 库${CMAKE_SOURCE_DIR}/gsl
)#将 src 对应的文件作为最终生成可执行文件的部分源文件
#add_executable(工程名称 参数1 参数2 ...)
#变量需要以${变量名}的形式引用
add_executable(c++_primer_plus ${src})

如果你想偷点懒,也可以在「practice」文件夹下的「CMakeLists.txt」中配置这些内容。

但可能更麻烦。

关闭「VS Code」,重新打开该工作区,CMake将会自动搜索编译器,并对整个工作区进行配置。

如果没有搜索到,Ctrl + Shift + P 打开命令菜单,搜索「cmake」,并选择「CMake: 编辑用户本地 CMake 工具包」,并添加/替换以下信息:(其中编译器路径应当改为MSYS2安装路径)

[{"name": "Clang 12.0.1 x86_64-w64-windows-gnu","compilers": {"C": "C:\\msys64\\Clang64\\bin\\clang.exe","CXX": "C:\\msys64\\Clang64\\bin\\clang++.exe"}}
]

由于我在设置中禁用了 CMake「保存时自动配置」(你也可以打开),当我们需要更新配置时,Ctrl + Shift + P 打开命令菜单,搜索「cmake」,并选择「CMake: 配置」。

此外,别忘了搜索「clangd」并选择「clangd: Restart language server」,让 Clangd 读取新的配置。

如果想要学习如何通过CMake来进行编译、链接,请在看完本文章后,浏览最后的-7- 参考

③用 Git 实现版本管理

什么是版本管理?你暂时可以认为版本管理是在备份我们的每一次修改,如果哪次修改不如意,你可以很简单地从中恢复过来。当然版本管理远不止这个用途

让 Git 忽略文件/文件夹

用 CMake 支撑框架一节,我们已经知道「.cache」文件夹是用于缓存 Clangd 分析出的信息,而每当我们启动「VSCode」或通过命令菜单手动「配置」时,「build」文件夹都会基于其他文件更新。——这两个文件夹根本没有备份的必要。

所以我们在工作区根目录新建全名为「.gitignore」的文件。在其中加入:

/.cache/
/build/

关于 .gitignore 的更多信息请参考 .gitignore

配置我们的 Git

首先我们要让 Git 认识我们。

新建一个终端(可参考-4- 常用快捷键 其他),键入以下内容:

git config --global user.name "你的昵称"
git config --global user.email "你的邮箱"

点击左侧「源代码管理」-「初始化存储库」。

你现在已经拥有一个接近专业的C++工作区了。


-4- 常用快捷键

越少从键盘切换到鼠标,我们的效率越高。

以下是部分常用快捷键(更多请参考 VSCode 快捷键 或 「文件」-「首选项」-「键盘快捷方式」):

插入行

  • Ctrl + Enter:在该行下方插入一行
  • Ctrl + Shift + Enter:在该行上方插入一行

行操作(可与 多光标和选取 搭配使用)

  • Ctrl + Shift + K:删除行
  • Alt + ↑/↓:移动行
  • Shift + Alt + ↑/↓:复制行

多光标和选取

  • Shift + ←/→:单字选取
  • Ctrl + Shift + ←/→:单词选取
  • Shift + Alt + ←/→:缩小/扩展选区
  • Ctrl + Alt + ↑/↓:在上/下方添加光标(无法撤销添加)
  • Ctrl + Shift + Alt + ↑/↓/←/→:块选择(也能添加光标且能撤销,选择到行尾后不会跳转到下一行)
  • Shift + Alt + i:在选择区域的各行末添加一个光标

其他

  • Ctrl + .:查看选中部分的快速修复(可配合 Ctrl + A 全选使用,也可以考虑直接使用 clang-tidy -fix,具体见官方文档)
  • Shift + Alt + .:如果选中部分仅有一个可修复项,对选中部分自动修复
  • Ctrl + S:保存当前文件
  • Ctrl + Shift + P:打开命令菜单
  • Ctrl + B:切换侧边栏的可见性
  • Ctrl + Shift + B:运行生成任务
  • Ctrl + Space:手动触发建议
  • Ctrl + Shift + Space:手动触发参数提示
  • Ctrl + `(Tab上方的那个键):切换终端的可见性(如果没有终端,会新建一个)
  • F2:重命名符号
  • F5:使用当前配置调试
  • F12:转到定义
  • Ctrl + ↑/↓:上/下滚编辑器
  • Ctrl + F/H:搜索/替换
  • 按住Ctrl,鼠标左键:转到定义、跳转到对应文件
  • ……

-5-(可选)我所使用的VSCode插件

使用方法请见快速安装我所推荐的插件

通用插件

{"recommendations": ["ms-vscode.azure-account","ms-azuretools.vscode-azureappservice","ms-azuretools.vscode-azureresourcegroups","hookyqr.beautify","aaron-bond.better-comments","samuelcolvin.jinjahtml","auchenberg.vscode-browser-preview","ms-ceintl.vscode-language-pack-zh-hans","formulahendry.code-runner","adpyke.codesnap","bierner.color-info","randomfractalsinc.vscode-data-preview","hediet.debug-visualizer","ms-azuretools.vscode-docker","cschlosser.doxdocgen","editorconfig.editorconfig","redvanworkshop.explorer-exclude-vscode-extension","mkxml.vscode-filesize","mhutchie.git-graph","github.vscode-pull-request-github","eamodio.gitlens","kisstkondoros.vscode-gutter-preview","wix.vscode-import-cost","oderwat.indent-rainbow","leetcode.vscode-leetcode","ritwickdey.liveserver","yzhang.markdown-all-in-one","webfreak.debug","eg2.vscode-npm-script","christian-kohler.npm-intellisense","techer.open-in-browser","ibm.output-colorizer","quicktype.quicktype","christian-kohler.path-intellisense","johnpapa.vscode-peacock","esbenp.prettier-vscode","chrmarti.regex","humao.rest-client","shan.code-settings-sync","tyriar.sort-lines","gruntfuggly.todo-tree","chakrounanas.turbo-console-log","visualstudioexptteam.vscodeintellicode","deerawan.vscode-faker","mikey.vscode-fileheader","vscode-icons-team.vscode-icons","jaspernorth.vscode-pigments","wasteamaccount.webtemplatestudio-dev-nightly","redhat.vscode-yaml","appulate.filewatcher","dbaeumer.vscode-eslint","vadimcn.vscode-lldb","codeinchinese.englishchinesedictionary","alefragnani.bookmarks","hbybyyang.gitee-vscode-plugin","bbenoist.doxygen","jbockle.jbockle-format-files","njpwerner.autodocstring","richie5um2.vscode-sort-json","ms-toolsai.jupyter-keymap","albymor.increment-selection","shd101wyy.markdown-preview-enhanced","nmsmith89.incrementor","ms-toolsai.jupyter","ms-toolsai.jupyter-renderers","jkjustjoshing.vscode-text-pastry","octref.vetur","asvetliakov.vscode-neovim"]
}

C++插件

{"recommendations": ["jeff-hykin.better-cpp-syntax","danielpinto8zz6.c-cpp-project-generator","twxs.cmake","ms-vscode.cmake-tools","guyutongxue.cpp-reference","llvm-vs-code-extensions.vscode-clangd","ms-vscode.cpptools","cheshirekow.cmake-format","jbenden.c-cpp-flylint"]
}

-6-(可选)我所使用的VSCode配置

使用方法请见配置配置文件

注意:配置中并没有给出Clangd的路径,请自行复制粘贴相关配置。

{/*********** VSCode ***********/"editor.unicodeHighlight.ambiguousCharacters": false,// 控制是否应在调试控制台中输入时接受建议; enter 还用于评估调试控制台中键入的任何内容"debug.console.acceptSuggestionOnEnter": "on",// 控制何时打开内部调试控制台"debug.internalConsoleOptions": "neverOpen",// 不允许 Enter 键处理输入时建议,避免换行与接受建议间的歧义// 你也可以允许该项,使用 Ctrl + Enter 进行换行"editor.acceptSuggestionOnEnter": "off",// 控制编辑器应当自动改写左引号或右引号"editor.autoClosingOvertype": "always",// 禁用自动检测文件缩进模式和缩进大小,即打开文件后自动将文件更改为 VSCode 配置的缩进格式"editor.detectIndentation": false,// 粘贴时格式化文件"editor.formatOnPaste": true,// 保存时格式化文件"editor.formatOnSave": true,// 在编辑器中自动显示内联建议"editor.inlineSuggest.enabled": true,// 是否在输入时显示含有参数文档和类型信息的小面板"editor.parameterHints.enabled": true,// 控制是否在键入代码时自动显示建议"editor.quickSuggestions": {// 键入注释时不允许"comments": false,// 键入其他时允许"other": true,// 键入字符串时不允许"strings": false},// 控制显示快速建议前的等待时间(毫秒)"editor.quickSuggestionsDelay": 0,// 控制编辑器在空白字符上显示符号的方式"editor.renderWhitespace": "none",// 代码片段建议置于其他建议之下"editor.snippetSuggestions": "bottom",// 使用空格缩进时模拟制表符的行为,可以方便对齐"editor.stickyTabStops": true,// 建议的接受方式"editor.suggest.insertMode": "replace",// 控制排序时是否提高靠近光标的词语的优先级"editor.suggest.localityBonus": true,"editor.suggest.shareSuggestSelections": true,// 控制建议小部件底部的状态栏可见"editor.suggest.showStatusBar": true,// 控制在键入触发字符后是否自动显示建议"editor.suggestOnTriggerCharacters": true,// 始终预先选择第一个建议"editor.suggestSelection": "first",// 一个制表符 = 2个空格"editor.tabSize": 2,// 控制是否根据文档中的文字提供建议列表"editor.wordBasedSuggestions": true,// 把文件删除时无需确认"explorer.confirmDelete": false,// 移动文件时无需确认"explorer.confirmDragAndDrop": false,// 粘贴同名文件时的重命名方式// smart: 在重复名称末尾智能地添加/递增数字"explorer.incrementalNaming": "smart",// 忽略扩展建议的通知"extensions.ignoreRecommendations": true,// 自动保存"files.autoSave": "afterDelay",// 自动保存的等待时间(毫秒)"files.autoSaveDelay": 1000,// 配置排除的文件和文件夹的glob模式// 文件资源管理器将根据此设置决定要显示或隐藏的文件和文件夹"files.exclude": {"**/.classpath": true,"**/.factorypath": true,"**/.project": true,"**/.settings": true},// 在会话间记住未保存的文件,以允许在退出编辑器时跳过保存提示// onExitAndWindowClose: 退出或窗口关闭时"files.hotExit": "onExitAndWindowClose",// Grunt 任务自动检测"grunt.autoDetect": "on",// Gulp 任务自动检测"gulp.autoDetect": "on",// 应该在何处显示单元格工具栏,或是否隐藏它"notebook.cellToolbarLocation": {// 默认: 右边"default": "right",// jupyter-notebook: 左边"jupyter-notebook": "left"},// 控制单元格编辑器中行号的显示"notebook.lineNumbers": "on",// 配置在搜索中排除的文件和文件夹的glob模式"search.exclude": {// "someFolder/": true,// "somefile": true},// 显示搜索结果所在行号"search.showLineNumbers": true,// 当搜索词为小写时,则不区分大小写进行搜索// 否则区分大小写"search.smartCase": true,// 集成终端默认为 PowerShell"terminal.integrated.defaultProfile.windows": "PowerShell",// 集成终端启用视觉化铃声"terminal.integrated.enableBell": true,// 集成终端编码: zh_CN.UTF-8"terminal.integrated.env.windows": {"LC_ALL": "zh_CN.UTF-8"},// 集成终端使用GPU加速"terminal.integrated.gpuAcceleration": "on",// 集成终端设置"terminal.integrated.profiles.windows": {"Command Prompt": {"args": [],"icon": "terminal-cmd","path": ["${env:windir}\\Sysnative\\cmd.exe","${env:windir}\\System32\\cmd.exe"]},"Git Bash": {"source": "Git Bash"},"Msys2": {"args": ["-defterm", "-no-start", "-here"],"env": {"CHERE_INVOKING": "1","MSYS2_PATH_TYPE": "inherit","MSYSTEM": "CLANG64"},"path": ["C:\\msys64\\msys2_shell.cmd"]},"PowerShell": {"icon": "terminal-powershell","source": "PowerShell"}},// 集成终端右击时选择光标下方的字词,并打开上下文菜单"terminal.integrated.rightClickBehavior": "selectWord","vsintellicode.modify.editor.suggestSelection": "automaticallyOverrodeDefaultValue",// 文件图标主题: 插件 vscode-icons"workbench.iconTheme": "vscode-icons",// 在没有从上一个会话恢复出信息的情况下,在启动时不打开编辑器"workbench.startupEditor": "none",// 显示视图头部的操作项"workbench.view.alwaysShowHeaderActions": true,"editor.largeFileOptimizations": false,"window.zoomLevel": 1/********* Font *********/// 输出窗口"[Log]": {// 字体大小"editor.fontSize": 15},// CodeLens的字体系列: Fira Code Retina"editor.codeLensFontFamily": "Fira Code Retina",// 字体系列: Fira Code Retina"editor.fontFamily": "Fira Code Retina",// 启用连字体"editor.fontLigatures": true,// 字体大小"editor.fontSize": 16,// 集成终端字体大小"terminal.integrated.fontSize": 14,/********** Color **********/// 控制是否对括号着色"editor.bracketPairColorization.enabled": true,// 启用括号指导线"editor.guides.bracketPairs": true,// 语义高亮"editor.semanticHighlighting.enabled": true,// 语义高亮自定义"editor.semanticTokenColorCustomizations": {"enabled": true,"rules": {// 抽象符号"*.abstract": {"fontStyle": "italic"},// 只读量等效为宏"readonly": "#4FC1FF",// 静态量(静态变量,静态函数)"*.static": {"fontStyle": "bold"},// 宏"macro": {// "foreground": "#8F5DAF""foreground": "#4FC1FF"},// 成员函数"method": {"fontStyle": "underline"},// 命名空间"namespace": {"foreground": "#00D780"},// 函数参数"parameter": {"foreground": "#C8ECFF"},// 只读的函数参数"parameter.readonly": {"foreground": "#7BD1FF"},// 成员变量,似乎需要clangd12以上"property": {"fontStyle": "underline","foreground": "#C8ECFF"},// 类型参数"typeParameter": "#31A567",// 未启用的宏"comment": "#767BA6"}},// 括号颜色"workbench.colorCustomizations": {"[Default Dark+]": {"editorBracketHighlight.foreground3": "#9CDCFE","editorBracketHighlight.foreground4": "#F3FD00","editorBracketHighlight.foreground5": "#F47D9F","editorBracketHighlight.foreground6": "#A5ADFE"}},/*********** Format ***********/"[jsonc]": {"editor.defaultFormatter": "esbenp.prettier-vscode"},/******** Git ********/// 自动从当前 Git 存储库的默认远程库提取提交"git.autofetch": true,// 同步 Git 存储库前确认"git.confirmSync": false,// 没有暂存的更改时,直接提交全部更改"git.enableSmartCommit": true,/*********** Clangd ***********/// 关闭 C/C++ 提供的 IntelliSenseEngine"C_Cpp.intelliSenseEngine": "Disabled",// Clangd 运行参数(在终端/命令行输入 clangd --help-list-hidden 可查看更多)"clangd.onConfigChanged": "restart","clangd.arguments": [// 启用 Clang-Tidy 以提供「静态检查」"--clang-tidy",// compelie_commands.json 文件的目录位置(相对于工作区,由于 CMake 生成的该文件默认在 build 文件夹中,故设置为 build)"--compile-commands-dir=build",// 建议风格:打包(重载函数只会给出一个建议);反可以设置为detailed"--completion-style=bundled",/*** Read user and project configuration from YAML files.* Project config is from a .clangd file in the project directory.* User config is from clangd/config.yaml in the following directories:*     Windows: %USERPROFILE%\AppData\Local*     Mac OS: ~/Library/Preferences/*     Others: $XDG_CONFIG_HOME, usually ~/.config** 我所使用的配置:* Diagnostics:*   ClangTidy:*     Add: ["*"]*     Remove:*       [*         abseil*,*         altera*,*         fuchsia*,*         llvmlib*,*         zircon*,*         google-readability-todo,*         readability-braces-around-statements,*         hicpp-braces-around-statements,*       ]* Index:*   Background: Build*/"--enable-config",// 默认格式化风格: 谷歌开源项目代码指南(可用的有 LLVM, Google, Chromium, Mozilla, Webkit, Microsoft, GNU 等)"--fallback-style=Google",// 启用这项时,补全函数时,将会给参数提供占位符,键入后按 Tab 可以切换到下一占位符,乃至函数末// 我选择禁用"--function-arg-placeholders=false",// 输入建议中,已包含头文件的项与还未包含头文件的项会以圆点加以区分"--header-insertion-decorators",// 允许补充头文件"--header-insertion=iwyu",// 让 Clangd 生成更详细的日志"--log=verbose",// pch优化的位置(memory 或 disk,选择memory会增加内存开销,但会提升性能)"--pch-storage=memory",// 输出的 JSON 文件更美观"--pretty",// 建议排序模型"--ranking-model=heuristics",// 同时开启的任务数量"-j=12"],// 自动检测 clangd 更新"clangd.checkUpdates": true,"clangd.path": "C:\\msys64\\clang64\\bin\\clangd.exe",// clangd的snippets有很多的跳转点,不用这个就必须手动触发Intellisense了"editor.suggest.snippetsPreventQuickSuggestions": false,/********** CMake **********/// 保存 cmake.sourceDirectory 或 CMakeLists.txt 内容时,不自动配置 CMake 项目目录"cmake.configureOnEdit": false,// 在 CMake 项目目录打开时自动对其进行配置"cmake.configureOnOpen": true,// 成功配置后,将 compile_commands.json 复制到此位置"cmake.copyCompileCommands": "",/********* LLDB *********/// LLDB 指令自动补全"lldb.commandCompletions": true,// LLDB 指针显示解引用内容"lldb.dereferencePointers": true,// LLDB 鼠标悬停在变量上时预览变量值"lldb.evaluateForHovers": true,// LLDB 监视表达式的默认类型"lldb.launch.expressions": "simple",// LLDB 不显示汇编代码"lldb.showDisassembly": "never",// LLDB 生成更详细的日志"lldb.verboseLogging": true,/*************** Extensions ***************/"better-comments.highlightPlainText": true,"better-comments.multilineComments": true,"better-comments.tags": [{"backgroundColor": "transparent","bold": false,"color": "#DC143C","italic": false,"strikethrough": false,"tag": "bug:","underline": false},{"backgroundColor": "transparent","bold": false,"color": "#DC143C","italic": false,"strikethrough": false,"tag": "\\$","underline": false},{"backgroundColor": "transparent","bold": false,"color": "#008000","italic": false,"strikethrough": false,"tag": "done:","underline": false},{"backgroundColor": "transparent","bold": false,"color": "#008000","italic": false,"strikethrough": false,"tag": "\\;","underline": false},{"backgroundColor": "transparent","bold": false,"color": "#4169E1","italic": false,"strikethrough": false,"tag": "fixme:","underline": false},{"backgroundColor": "transparent","bold": false,"color": "#4169E1","italic": false,"strikethrough": false,"tag": "\\%","underline": false},{"backgroundColor": "transparent","bold": false,"color": "#DEB887","italic": false,"strikethrough": false,"tag": "note:","underline": false},{"backgroundColor": "transparent","bold": false,"color": "#DEB887","italic": false,"strikethrough": false,"tag": "\\]","underline": false},{"backgroundColor": "transparent","bold": false,"color": "#FFD700","italic": false,"strikethrough": false,"tag": "star:","underline": false},{"backgroundColor": "transparent","bold": false,"color": "#FFD700","italic": false,"strikethrough": false,"tag": "\\*","underline": false},{"backgroundColor": "transparent","bold": false,"color": "#FF2C00","italic": false,"strikethrough": false,"tag": "alert:","underline": false},{"backgroundColor": "transparent","bold": false,"color": "#FF2C00","italic": false,"strikethrough": false,"tag": "\\!","underline": false},{"backgroundColor": "transparent","bold": false,"color": "#3498DB","italic": false,"strikethrough": false,"tag": "question:","underline": false},{"backgroundColor": "transparent","bold": false,"color": "#3498DB","italic": false,"strikethrough": false,"tag": "\\?","underline": false},{"backgroundColor": "transparent","bold": false,"color": "#FF8C00","italic": false,"strikethrough": false,"tag": "todo:","underline": false},{"backgroundColor": "transparent","bold": false,"color": "#FF8C00","italic": false,"strikethrough": false,"tag": "\\>","underline": false}],// Code Runner 执行命令,考虑到一致性,可执行文件输出到build文件夹中,命名为debug"code-runner.executorMap": {"cpp": "cd $dir && clang++ $fileName -pedantic -Wall -Wextra -pthread -fuse-ld=lld -fsanitize=address -fsanitize=undefined -stdlib=libc++ -std=c++20 --target=x86_64-w64-mingw -o $workspaceRoot\\build\\test && $workspaceRoot\\build\\test"},// Code Runner 在终端中运行"code-runner.runInTerminal": true,// doxygen 使用 Git 中配置的用户邮箱"doxdocgen.generic.useGitUserEmail": true,// doxygen 使用 Git 中配置的用户名"doxdocgen.generic.useGitUserName": true,// 缩进彩虹更新等待时间(毫秒)"indentRainbow.updateDelay": 0,// Jack 任务自动检测"jake.autoDetect": "on",// 授权向 Red Hat 服务器上传使用数据和错误"redhat.telemetry.enabled": true,"todo-tree.filtering.excludeGlobs": ["build", "data"],"todo-tree.general.tagGroups": {"ALERT": ["ALERT:"],"BUG": ["BUG:"],"DONE": ["DONE:"],"FIXME": ["FIXME:"],"NOTE": ["NOTE:"],"QUESTION": ["QUESTION:"],"STAR": ["STAR:"],"TODO": ["TODO:", "TODO(www41):"]},"todo-tree.general.tags": ["ALERT:","QUESTION:","TODO:","TODO(www41):","DONE:","FIXME:","BUG:","NOTE:","STAR:","alert:","question:","todo:","done:","fixme:","bug:","note:","star:"],"todo-tree.highlights.customHighlight": {"ALERT": {"background": "#FF2C00","foreground": "#FFFAFA","icon": "alert","iconColour": "#FF2C00","rulerColour": "#FF2C00"},"BUG": {"background": "#DC143C","foreground": "#FFFAFA","iconColour": "#DC143C","rulerColour": "#DC143C"},"DONE": {"background": "#008000","foreground": "#FFFAFA","icon": "check-circle-fill","iconColour": "#008000","rulerColour": "#008000"},"FIXME": {"background": "#4169E1","foreground": "#FFFAFA","icon": "gear","iconColour": "#4169E1","rulerColour": "#4169E1"},"NOTE": {"background": "#DEB887","foreground": "#000000","icon": "bookmark-fill","iconColour": "#DEB887","rulerColour": "#DEB887"},"QUESTION": {"background": "#3498DB","foreground": "#FFFAFA","icon": "question","iconColour": "#3498DB","rulerColour": "#3498DB"},"STAR": {"background": "#FFD700","foreground": "#3E13AF","icon": "star-fill","iconColour": "#FFD700","rulerColour": "#FFD700"},"TODO": {"background": "#FF8C00","foreground": "#FFFAFA","iconColour": "#FF8C00","rulerColour": "#FF8C00"},"alert:": {"background": "#FF2C00","foreground": "#FFFAFA","hideFromTree": true,"icon": "alert","iconColour": "#FF2C00","rulerColour": "#FF2C00"},"bug:": {"background": "#DC143C","foreground": "#FFFAFA","hideFromTree": true,"iconColour": "#DC143C","rulerColour": "#DC143C"},"done:": {"background": "#008000","foreground": "#FFFAFA","hideFromTree": true,"icon": "check-circle-fill","iconColour": "#008000","rulerColour": "#008000"},"fixme:": {"background": "#4169E1","foreground": "#FFFAFA","hideFromTree": true,"icon": "gear","iconColour": "#4169E1","rulerColour": "#4169E1"},"note:": {"background": "#DEB887","foreground": "#000000","hideFromTree": true,"icon": "bookmark-fill","iconColour": "#DEB887","rulerColour": "#DEB887"},"question:": {"background": "#3498DB","foreground": "#FFFAFA","hideFromTree": true,"icon": "question","iconColour": "#3498DB","rulerColour": "#3498DB"},"star:": {"background": "#FFD700","foreground": "#3E13AF","hideFromTree": true,"icon": "star-fill","iconColour": "#FFD700","rulerColour": "#FFD700"},"todo:": {"background": "#FF8C00","foreground": "#FFFAFA","hideFromTree": true,"iconColour": "#FF8C00","rulerColour": "#FF8C00"}},"todo-tree.highlights.defaultHighlight": {"rulerLane": "left","type": "tag"},"todo-tree.regex.regex": "((\\**|//|#|<!--|;|/\\*|^)\\s*($TAGS)(\\([\\w]+\\))?:?|^\\s*- \\[ \\])"
}

-7- 参考

  • Get Started with C++ and Mingw-w64 in Visual Studio Code
  • Clang 编译器用户手册
  • Clang-Format 风格配置
  • Clang-Format 文档
  • vscode-lldb 用户手册
  • 在windows上通过msys2/mingw来安装gcc / clang_茶佬牛逼
  • 配置VSCode的C/C++语言功能 - literalkernel
  • 最终,我看向了clangd
  • CMake 简介和 CMake 模板 - 米罗西
  • CMake在多级目录项目中的简单使用
  • VSCode 配置 C/C++ 终极解决方案:vs code + clang + clangd + lldb (MacOS利用完整 clang-llvm 工具链)
  • CMake简明教程 实例工程演示(含字幕)

VSCode 配置 C++:VSCode + Clang + Clangd + LLDB + CMake + Git相关推荐

  1. c# vscode 配置_[VSCode插件推荐] Code Runner: 代码一键运行,支持超过40种语言

    记得两年多前,笔者那时还在写 PHP,同时需要写 Python 和 Node.js .所以在那时,支持多种语言的 VS Code 已经是笔者的主力编辑器了.唯一不足的是,笔者希望在VS Code里,能 ...

  2. VScode配置LaTeX

    VScode & Latex 鉴于latex的简洁和VScode的强大兼容性,本文简单记录了笔者在code上配置latex的过程. VScode 最突出的特点就是其强大的插件功能,能够配置为高 ...

  3. 【转】vscode配置C/C++环境

    转自:vscode配置C/C++环境 - 知乎 VS Code配置 作者:谭九鼎 链接:Visual Studio Code 如何编写运行 C.C++ 程序? - 知乎 有改动.个人按照步骤后,做到复 ...

  4. VSCode配置 for Mac(一)C++

    VSCode配置 for Mac 本文只是记录一下自己熬这些编程配置环境的苦难历程(其实是给自己以后看的,包括c++.python.java环境的配置,旨在是用一个平台搭建多个语言的开发,陆续更新) ...

  5. mac系统vscode配置c/c++环境

    mac系统vscode配置c/c++环境 本文介绍mac系统下vscode的安装以及c环境的配置: 本文特点: 1. 可以在vscode自带的终端里显示c程序运行结果. 2. 调试c程序时,程序中需要 ...

  6. VScode配置C语言环境以及VScode中变量说明

    文章目录 1 编译器MinGW 1.1 MinGW简介 1.2 MinGW下载安装 1.3 配置MinGW的环境变量 1.4 验证配置的MinGW 2 VSCode配置 2.1 安装插件 2.1.1 ...

  7. Mac VSCode配置C语言环境(可以调试)

    Mac VSCode配置C语言环境 c_cpp_properties.json tasks.json launch.json 新建一个文件夹,用vscode,然后再新建一个test.c文件. #inc ...

  8. ubuntu16.04编译安装c++ opencv与vscode配置debug

    一.编译安装c++ opencv 1.下载zip包 本文安装的是opencv3.4.3,下载链接,以Sources方式下载zip包. 2.安装依赖 sudo apt-get install build ...

  9. linux下vscode配置c++,使其和Visual Studio2019一样调试

    这篇文章是通过Makefile命令的形式进行配置的,这对大工程不友好,因此写了一篇vscode联合cmake进行环境配置,大家可以看这篇文章 linux下c++编译的方式 在win下visual st ...

最新文章

  1. [转]Chrome 控制台console的用法
  2. WCF 第二章 契约 系列文章
  3. python生成yaml_使用python脚本自动生成K8S-YAML的方法示例
  4. python网络爬虫系列教程_Python网络爬虫系列教程连载 ----长期更新中,敬请关注!...
  5. poj 2499第K短路模板
  6. Java基础学习(3)-泛型
  7. linux如何配置本地yum,Linux配置本地yum源配置方法
  8. **matlab中grid、grid on 和grid off用法**
  9. kali linux 2020.4 自带浏览器英文改中文
  10. SEO博客外链怎么做?现在的话是注重站内内容还是什么?
  11. mac android手机调试,mac 无法连接android手机进行调试 解决方案
  12. 【以太网硬件一】802.3xx标准怎么这么多?它们有什么关系?
  13. 专家调查显示:液晶电视坏眼超等离子电视
  14. excel图片技巧:如何为报表配上节日祝福动画
  15. 基于SPringBoot的玩具销售商城管理系统
  16. python:实现红黑树算法(附完整源码)
  17. [book]《心流:最优体验心理学》
  18. python正则表达式介绍
  19. 计算机卡顿是硬盘还是内存条,笔记本电脑升级固态硬盘和内存条方案解析,彻底告别电脑卡顿!...
  20. 【计算机网络】DNS域名解析

热门文章

  1. 《精通特征工程》学习笔记(2):文本数据:扁平化、过滤和分块
  2. 部署traefik2.2
  3. android远程控制电视盒子,电视机顶盒远程遥控其实很简单 小白也能不在家帮爸妈遥控...
  4. 技术平台分层体系-PaaS层浅析
  5. 如何脱离数学推导理解欧拉角与万向节死锁
  6. GitLab分支合并
  7. python聊天室详细教程_python简单实现聊天室功能(代码教程)
  8. Python代码图像特效算法制作
  9. 自动驾驶记忆泊车HAVP功能设计
  10. 计算机作业ppt能用wps吗,WPS演示怎么设置PPT可以在未安装WPS的电脑上打开?