c++ properties_借助C/C++ Extension实现VSCode C++代码补全

在VSCode C/C++ IntelliSense领域,目前有两位实力相当的选手,它们分别是基于微软闭源技术的C/C++ Extension和开源方案clangd。根据我目前体验,它俩的特性可以总结如下:

71cba1903753b6c9635cf52ee73ae327.png
表1 C/C++ Extension vs clangd

本文将介绍如何借助C/C++ Extension实现对C++项目的完美索引。(本文是上篇介绍clangd的续作,大家可以把两篇文章结合起来参考。)

浆果:借助clangd实现VSCode C++代码补全​zhuanlan.zhihu.com

安装并配置C/C++ Extension

作为VSCode官方发布的C/C++插件,C/C++ Extension的安装和使用都比较简单直观。当使用VSCode打开后缀为.c/.cpp/.cc/.cxx的文件时,VSCode便会跳出弹窗建议我们安装C/C++ Extension。

2ad920a18f0ebcb716067b1e31f9888e.png
图1 C/C++ Extension

b257e55b7006ac3b75be8b56a7319172.png
图2 建议安装C/C++ Extension的弹窗

关于C/C++ Extension的安装和简单配置本文将不再赘述,读者可以根据微软官方说明一步步执行,并不困难。

值得一提的是,C/C++ Extension虽然在Github提供其TypeScript源码,但在安装过程中,还是会根据部署平台的不同,下载对应的cpptools和cpptools-srv二进制文件。这两个文件与clangd功能类似,都算是C++代码补全器的LSP后端,但由于其闭源性,目前只被C/C++ Extension调用。在大家运行VSCode并启动C/C++ Extension时,是可以看到两个同名进程在后台运行的。

c_cpp_properties.json配置方案

为了帮助C/C++ Extension更全面地认识C++项目,C/C++ Extension会建议用户在c_cpp_properties.json中补全项目编译相关信息。所以我觉得,入门C/C++ Extension只需学会往c_cpp_properties.json文件中添加includePath参数即可,不用像clangd那样还要借助编译系统生成Compilation Database。这在一定程度上降低了用户的负担,所以C/C++ Extension的上手难度不高,对用户相当友好。

284669dcbc782fc8d28da26c20b9cee2.gif
图3 在c_cpp_properties.json配置includePath后的使用情况

但编译信息的缺乏,也使得C/C++ Extension并不能实现项目内代码的完美索引。如上图所示,用户使用过程中还会报出莫名其妙的头文件、宏/变量缺失等问题。

Compilation Database配置方案

有趣的是,为clangd配置的Compilation Database也可以被C/C++ Extension发现并使用。尽管我从没在C/C++ Extension的文档中看到对LLVM定义的Compilation Database的支持,但C/C++ Extension却可以无缝使用,兼容性是真的强。

eb51292b94c0e9e00c9231a3f13e7170.png
图4 C/C++ Extension提醒项目缺少Compilation Database,回退到c_cpp_properties.json

借助Compilation Database提供的编译信息,C/C++ Extension对系统的索引能力可以达到跟clangd相同的水平,能够完美实现项目内跳转、代码补全等功能。之前c_cpp_properties.json配置方案中出现的误报头文件丢失等问题也都不复存在。所以推荐有能力对项目进行编译的同学为C/C++ Extension提供Compilation Database。

458d1d21d7fb533c049e51cb4cfe2410.gif
图5 提供Compilation Database后的使用情况

但不得不吐槽,基于Compilation Database相关信息进行补全和跳转时,C/C++ Extension后台程序cpptool和cpptool-srv的内存占用,也是很可观的。

fd028ca42b21f0eeaa441450e7b9334b.png
图6 基于Compilation Database工作的cpptools(-srv)资源消耗

跟只配置c_cpp_properties.json时的内存消耗相比,还是多出不少的。

f40670fc848f463e410e68a94260e04b.png
图7 基于c_cpp_properties.json工作的cpptools(-srv)资源消耗

相比之下,在处理同等规模项目(源码量30MB左右)时,基于相同Compilation Database的clangd的内存占用跟使用c_cpp_properties.json时的C/C++ Extension基本持平(甚至更少)。

5bd4dc1743aadbca5d34f5119333dbf0.png
图8 基于Compilation Database工作的clangd资源消耗

总结

通过对比可以发现:如果开发环境不能满足对C++项目进行编译的要求,使用C/C++ Extension并配置c_cpp_properties.json文件便可满足大部分代码补全和跳转的需求。但此时会存在少量头文件、宏定义报错等问题。

如果开发环境可以编译C++项目,推荐借助相关工具生成Compilation Database,以此来辅助C/C++ Extension或clangd实现项目内精准索引,这会给略显繁琐的C/C++编程带来更棒体验。

以上,全文终。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值