VSCode+clangd让写C/C++代码更丝滑
使用C/C++写了十几二十年的代码了,这两年做的项目都是使用Go语言来写的代码了,主要使用Goland来写Go,写起来是相当的丝滑,自动提示、补充代码就不说了,很多IDE都有的功能,它还支持自动添加代码import包,提示如何修复错误等等。C/C++也有IDE可以做到了,这一切都要归功于LLVM的优秀设计,让编译器实现模块化,出了clang、clangd、clang-tidy等等优秀的产品,真是C/C++爱好者的福音。
clangd
之所以能够很好的理解C/C++代码,实现代码补全、跳转、提示等等功能,就是因为它在clang编译器的基础上使用语言服务协议(Language Server Protocol)与IDE进行实时交互。
clangd
还能够调用clang-tidy
进行代码的静态分析:
下面就简单介绍一下VSCode如何使用clangd更丝滑地写C/C++代码。
一、环境安装
至于编译器的安装就不多说了,Windows下可以安装MSYS2的MINGW64,然后安装Clang编译器和GCC编译器;Linux与MacOS下都可以安装Clang和GCC编译器。
笔者的MacOS是Clang 9,没有升级到新版本,所以没有clangd
和clang-tidy
需要自行安装:
- clangd
目前虽然clang 18都出来了,但是
clangd
的最新稳定版本是 17.03,MacOS系统下载 clangd-mac-17.0.3.zip后解压后把clangd
放到/usr/local/bin
即可。 - clang-tidy
可以直接使用
pip install clang-tidy
来安装。
VSCode中安装插件clangd
:
为了更好地管理项目的构建,建议使用目前流行的cmake来构建,所以还需要安装插件
cmake
、cmake-tools
,如果喜欢使用lldb
来调试代码,需要安装插件CodeLLDB
:
注意:clangd
与微软的C/C++
插件有冲突,如果使用clangd
则需要禁用C/C++
插件的intelliSenseEngine
,在settings.json
中添加配置:
1"C_Cpp.intelliSenseEngine": "disabled",
或者直接卸载掉C/C++
插件。
二、配置
我们知道,C与C++的语法以及使用的头文件是不完全一样的,要想让clangd
按我们的想法去处理,就需要进行一些配置。
clangd
的配置有两种方式,一种是项目级的,另一种是用户级的。
项目级的只需要在项目的根目录添加一个.clangd
的配置文件即可。
用户级的就需要根据不同的操作系统来添加config.yaml
配置文件到不同的路径下:
- Windows:
%LocalAppData%\clangd\config.yaml
, 比如C:\Users\witton\AppData\Local\clangd\config.yaml
- macOS:
~/Library/Preferences/clangd/config.yaml
- Linux and others:
$XDG_CONFIG_HOME/clangd/config.yaml
, 通常为:~/.config/clangd/config.yaml.
不管是.clangd
还是config.yaml
它的格式都是yaml
格式,配置方法完全一样。如果既配置了用户级的config.yaml
,又配置了项目级的.clangd
,则会同时启用相关配置,如果发生冲突,用户级的config.yaml
优先级最高,其次是内部项目级,最后是引用的外部项目级。
一个C/C++项目可能既有C语言文件,也有C++文件,前面有提到,它们是需要有不同的处理方式,C语言需要使用C语言的标准,C++需要使用C++的标准。比如C使用C17标准,C++使用C++23,可以分别配置不同的块,为不同的扩展名使用不同的编译参数,块与块之间使用---
来分隔:
1# 这段为C++代码配置
2If:
3 PathMatch: [.*\.cpp, .*\.cxx, .*\.cc, .*\.h, .*\.hpp, .*\.hxx]
4CompileFlags:
5 Add: [-std=c++23]
6---
7# 这段为C代码配置
8If:
9 PathMatch: [.*\.c]
10CompileFlags:
11 Add: [-std=c17]
前面有说过clangd
还能够整合clang-tidy
进行C/C++代码的静态分析,实时对代码进行诊断,在配置文件中添加:
1Diagnostics:
2 ClangTidy:
3 Add: ["*"]
并在settings.json
中添加配置:
1"clangd.arguments": [
2 "--clang-tidy"
3 ]
启用clang-tidy
。这样配置会把所有提示都给出来,但有些提示不会影响代码质量,只是为了更加规范罢了,比如未引用的变量之类的等等。笔者把笔者的配置贴出来:
1Diagnostics:
2 ClangTidy:
3 Add: ["*"]
4 Remove:
5 [
6 abseil*,
7 altera*,
8 fuchsia*,
9 llvmlib*,
10 zircon*,
11 google-readability-todo,
12 readability-braces-around-statements,
13 hicpp-braces-around-statements,
14 misc-unused*
15 ]
16 CheckOptions:
17 WarnOnFloatingPointNarrowingConversion: false
18---
19# 这段为C++代码配置
20If:
21 PathMatch: [.*\.cpp, .*\.cxx, .*\.cc, .*\.h, .*\.hpp, .*\.hxx]
22CompileFlags:
23 Add: [-std=c++23]
24---
25# 这段为C代码配置
26If:
27 PathMatch: [.*\.c]
28CompileFlags:
29 Add: [-std=c17]
settings.json
:
1 "C_Cpp.intelliSenseEngine": "disabled",
2 "clangd.onConfigChanged": "restart",
3 "clangd.arguments": [
4 "--fallback-style=Chromium", // 设置默认的代码格式化风格
5 "--clang-tidy",
6 "--clang-tidy-checks=performance-*,bugprone-*",
7 "--query-driver=/usr/bin/clang,/usr/bin/clang++",
8 "--all-scopes-completion",
9 "--completion-style=detailed",
10 "--function-arg-placeholders",
11 "--header-insertion=iwyu",
12 "--pch-storage=disk"
13 ],
14 "cmake.exportCompileCommandsFile": true,
clangd
还可以调用clang-format
对代码进行格式化,如果项目根目录中有.clang-format
文件,则会按文件中的配置来格式化代码,否则会使用默认的风格进行格式化,但如果想要更改默认的代码风格,可以添加--fallback-style
参数,如上配置所示,--fallback-style=Chromium
指定默认的格式化风格为Chromium
。可以选择的代码风格有:LLVM
、 Google
、Chromium
、Mozilla
、WebKit
、 Microsoft
、GNU
等。
如果想要笔者前面所示的提示到代码编辑中,可以安装usernamehw.errorlens
插件:
- 原文作者:Witton
- 原文链接:https://wittonbell.github.io/posts/2024/2024-03-31-VSCode+clangd让写C_C++代码更丝滑/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. 进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。