VSCode Cpp 配置
记录一下VSCode配置C++的内容吧。
必要软件
为了正常使用所有功能,除了针对VSCode的配置,需要单独安装下列软件,并把路径添加到PATH
- Git
- CMake
- ninja
插件列表
首先列一下目前在VSCode上使用的,涉及到C++的核心插件:
- C/C++ (Microsoft):微软官方默认的C/C++插件,禁用了代码提示,但是调试这些还需要用它,不能完全禁用
- clangd (LLVM):LLVM官方提供的,当前代码提示的主力插件
- CMake Tools (Microsoft):微软官方提供的CMake支持,提供CMake命令工具条和快捷指令,以及CMake语法高亮
- CodeLLDB (Vadim Chugunov):lldb调试支持,非官方支持
还有两个不太重要的插件:
- C/C++ Themes (Microsoft)
- Better C++ Syntax (Jeff Hykin)
补充:通过clangd (LLVM) 插件安装的clangd虽然是最新版本,但是代码修正功能可能有问题,还是直接使用系统中的clangd更加可靠。
C/C++ 插件和 clangd 插件配置
主要的内容是禁用默认C/C++插件的主要功能,然后用clangd以及对应插件替换掉,并对clangd进行配置。
1 | //[[C++]] |
1 | //[[clangd]] |
CMaketools 插件配置
对CMake提供支持的插件配置。
1 | //[[cmake]] |
如果 CMakeLists.json 插件在识别编译工具链时出现错误,可以直接删除,让它重新扫描配置(也可以手动修改,但是插件在重新扫描时会直接覆盖)
- 在Windows中,配置文件位于
~/AppData/Local/CMakeTools/cmake-tools-kits.json
- 在WSL2中,配置文件位于
~/.local/share/CMakeTools/cmake-tools-kits.json
C++ 调试配置
下面的部分是关于CMake项目调试的配置,早期这种配置必须存放在项目的.vscode/launch.json
文件中,
现在已经支持在settings.json中添加默认配置了。
这三种配置使用的调试器分别是:
- lldb
- gdb
- vsdbg
分别对应与clang,gcc和MSVC。
用它们调试对应的编译器得到的可执行程序通常是没问题的,但是混用是很可能有问题的:
- 在Windows上:(clang是基于MSVC的,gcc则是基于MinGW)
- 对于MSVC和clang生成的可执行文件,可以使用vsdbg或lldb调试
- 对于gcc生成的可执行文件,只能使用gdb调试
- 其它情况下无法调试,例如无法在端点中断
- 如果clang也基于MinGW,那么对于gcc和clang生成的可执行文件,可以使用gdb或lldb调试
- Linux:(clang的底层是基于gcc)
- 对于gcc和clang生成的可执行文件,可以使用gdb或lldb调试
1 | //**************************************************************************// |
在 Linux 上使用 gdb 调试时,调试结束可能会产生一条额外的信息
1
[1] + Done "/usr/bin/gdb" --interpreter=mi --tty=${DbgTerm} 0<"/tmp/Microsoft-MIEngine-In-ke1rzd3e.fgm" 1>"/tmp/Microsoft-MIEngine-Out-vqfwhzpa.2bs"
这并不是错误,而是 VSCode C++ 扩展的调试机制导致的。
clangd 配置
这里的clangd指的是专门的软件(通常在下载clang时附带下载),并不是VScode插件,关于clangd主要有三种配置文件:
.clangd
:主配置文件;.clangd-tidy
:关于C++静态检查的配置文件;.clangd-format
:关于C++格式化检查的配置文件;
.clangd
clangd有时候比较蠢,我们可以通过在项目根目录添加.clangd
配置文件来协助,例如它很可能在Windows上找不到正确的标准库头文件,而是会跳转到MSVC的标准库头文件,我们可以添加--include-directory=
来指定。
.clangd
示例如下 1
2
3
4
5
6
7
8CompileFlags:
Add:
- '-Wall'
- '-Wextra'
- '-Wshadow'
- '-Wno-unused-parameter'
- '-std=c++17'
- '--include-directory=/path/to/compiler/include'
有时候需要使用C语言项目,但是默认的配置是针对C++的,对于C语言项目可以使用下面的配置,重点是-xc
选项
1
2
3
4
5
6
7CompileFlags:
Remove: [-std=*]
Add: [-xc, -Wall]
Compiler: clang
Diagnostics:
ClangTidy:
Remove: readability-identifier-naming
除此之外,clangd主要会基于compile_commands.json
文件进行代码提示,CMake项目可以用特定选项在build/
中自动生成compile_commands.json
。
clangd 对于头文件的分析有时候很愚蠢,非要警告某些头文件没有被当前的文件实际使用,但是它其实有特别的用途(比如导出接口,或者就是clangd没有分析出来),真正将其移除又会导致编译失败, 此时可以使用下面的注释来关闭对应警告(IWYU:include-what-you-use),参考官方文档
1 |
.clang-tidy
clang-tidy可以提供C++的静态语法检查,包括很多具体规则的检查(有的检查过于严格了,不能全部开启),通过.clang-tidy
配置文件设置。
可以使用指定注释关闭特定位置的静态语法检查:
关闭当前行的所有检查或特定检查
1
2xxx // NOLINT
xxx // NOLINT(xxx)关闭下一行的所有检查或特定检查
1
2xxx // NOLINTNEXTLINE
xxx // NOLINTNEXTLINE(xxx)关闭指定代码块的全部检查或特定检查
1
2
3
4
5
6
7// NOLINTBEGIN
xxx
// NOLINTEND
// NOLINTBEGIN(check-name)
xxx
// NOLINTEND(check-name)
.clang-tidy
模板如下,具体含义可以参考clang官方文档。
1 | Checks: 'bugprone-*, |
.clang-format
clang-format可以提供C++的代码格式化,包括很多具体规则的检查,需要通过.clang-format
配置文件设置。
可以使用如下的注释去关闭特定位置的格式化 1
2
3// clang-format off
xxx
// clang-format on
目前使用的 .clang-format
模板如下,更完整的内容可以参考clang官方文档。
1 | --- |