赞
踩
在VSCode C/C++ IntelliSense领域,目前有两位实力相当的选手,它们分别是基于微软闭源技术的C/C++ Extension和开源方案clangd。根据我目前体验,它俩的特性可以总结如下:
本文将介绍如何借助C/C++ Extension实现对C++项目的完美索引。(本文是上篇介绍clangd的续作,大家可以把两篇文章结合起来参考。)
浆果:借助clangd实现VSCode C++代码补全zhuanlan.zhihu.com作为VSCode官方发布的C/C++插件,C/C++ Extension的安装和使用都比较简单直观。当使用VSCode打开后缀为.c/.cpp/.cc/.cxx
的文件时,VSCode便会跳出弹窗建议我们安装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/C++ Extension更全面地认识C++项目,C/C++ Extension会建议用户在c_cpp_properties.json
中补全项目编译相关信息。所以我觉得,入门C/C++ Extension只需学会往c_cpp_properties.json
文件中添加includePath
参数即可,不用像clangd那样还要借助编译系统生成Compilation Database。这在一定程度上降低了用户的负担,所以C/C++ Extension的上手难度不高,对用户相当友好。
但编译信息的缺乏,也使得C/C++ Extension并不能实现项目内代码的完美索引。如上图所示,用户使用过程中还会报出莫名其妙的头文件、宏/变量缺失等问题。
有趣的是,为clangd配置的Compilation Database也可以被C/C++ Extension发现并使用。尽管我从没在C/C++ Extension的文档中看到对LLVM定义的Compilation Database的支持,但C/C++ Extension却可以无缝使用,兼容性是真的强。
借助Compilation Database提供的编译信息,C/C++ Extension对系统的索引能力可以达到跟clangd相同的水平,能够完美实现项目内跳转、代码补全等功能。之前c_cpp_properties.json
配置方案中出现的误报头文件丢失等问题也都不复存在。所以推荐有能力对项目进行编译的同学为C/C++ Extension提供Compilation Database。
但不得不吐槽,基于Compilation Database相关信息进行补全和跳转时,C/C++ Extension后台程序cpptool和cpptool-srv的内存占用,也是很可观的。
跟只配置c_cpp_properties.json
时的内存消耗相比,还是多出不少的。
相比之下,在处理同等规模项目(源码量30MB左右)时,基于相同Compilation Database的clangd的内存占用跟使用c_cpp_properties.json
时的C/C++ Extension基本持平(甚至更少)。
通过对比可以发现:如果开发环境不能满足对C++项目进行编译的要求,使用C/C++ Extension并配置c_cpp_properties.json
文件便可满足大部分代码补全和跳转的需求。但此时会存在少量头文件、宏定义报错等问题。
如果开发环境可以编译C++项目,推荐借助相关工具生成Compilation Database,以此来辅助C/C++ Extension或clangd实现项目内精准索引,这会给略显繁琐的C/C++编程带来更棒体验。
以上,全文终。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。