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

2023-05-16

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

表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。

图1 C/C++ Extension

图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的上手难度不高,对用户相当友好。

图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却可以无缝使用,兼容性是真的强。

图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。

图5 提供Compilation Database后的使用情况

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

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

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

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

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

图8 基于Compilation Database工作的clangd资源消耗

总结

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

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

以上,全文终。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++ properties_借助C/C++ Extension实现VSCode C++代码补全 的相关文章

  • mongoose .find() 方法返回具有不需要的属性的对象

    所以 我和猫鼬一起工作已经有一段时间了 我发现了一些非常奇怪的事情 如果有人能启发我 那就太好了 问题是 当使用 mongoose 的 find 方法时 我作为响应得到的对象充满了我不知道它来自哪里的属性 我猜测它们是内置属性 但无论如何
  • 如何在 Javascript 中查找财产的所有者

    好的 因为我最初的问题听起来不清楚 所以我决定对其进行编辑 我的问题是如何找出谁定义了某个属性 例如parseInt函数 我如何知道它是在哪个对象上定义的 就像 ifparseInt被定义在window对象或document对象或任何对象
  • 直接调用分配给对象属性的闭包

    我希望能够直接调用分配给对象属性的闭包 而无需将闭包重新分配给变量然后调用它 这可能吗 下面的代码不起作用并导致Fatal error Call to undefined method stdClass callback obj new s
  • 为什么在非 ARC 环境中的属性上使用关键字“strong”?

    我刚刚开始使用 Xcode 4 2 和 iOS5 进行开发 创建空的选项卡式应用程序项目后 我注意到属性上使用了新的关键字 strong 我继续读下去这个帖子 https stackoverflow com questions 670102
  • 从 .properties 文件初始化 JUnit 常量,该常量从 pom.xml 文件初始化

    请原谅复杂的标题 背景 pom xml
  • C# 9 中的 Init-Only 和 ReadOnly 有什么区别?

    我正在经历C 9 新特性 https devblogs microsoft com dotnet welcome to c 9 0 即将发布 仅初始化 https devblogs microsoft com dotnet welcome
  • getter 和 setter 的 Google 样式指南属性

    我对其中的一项建议感到好奇有关属性的 Google Python 风格指南 https google github io styleguide pyguide html Properties 他们在其中给出了以下示例 class Squar
  • SSRS - 条件文本格式(使用 Switch 的表达式)

    我将首先说明这些表达式在报告中确实有效 问题是他们没有一起工作 我目前有一个基于两列值格式化的列标题 根据 Column1 的值使用斜体和下划线 基于 Column2 值的粗体和特定颜色 我通过在文本属性中使用 Switch 表达式来完成此
  • 公共属性和私有成员 C#

    只使用公共属性而不是使用公共属性来访问私有变量有什么好处 例如 public int iMyInt get set 代替 private int myint public int iMyInt get return myint set my
  • 属性的访问器实现

    是否有一些文档说明编译器如何自动生成属性的访问器 当编写自定义访问器 覆盖合成的访问器 时 最好了解原始实现 特别是要查看具有不同 弱 强 保留 复制等 属性的属性的访问器的不同实现 是否有一些文档说明编译器如何自动生成属性的访问器 编译器
  • 如何在 Eclipse 项目中实现属性页

    这是交易 我以编程方式在 eclipse rcp 中创建一个项目 然后我向它添加一些持久属性 现在我想右键单击项目资源管理器视图中的项目 然后单击属性选项卡 应该有我的属性页 这是我所拥有的
  • IBOutlet 应该是 ivars 还是属性?

    尽管我确信它们存在 但我很难找到或确定在 ViewController 中声明出口的官方最佳实践 据我所知 有 3 个选项 仅伊瓦尔 仅限财产 由 ivar 支持的财产 当前 当我尝试通过从 IB 拖入 ViewController 来自动
  • 配置Tomcat使用属性文件加载DB连接信息

    创建从属性文件读取配置参数的 Tomcat 部署的可接受做法是什么 如果能够提供 WAR 文件并指定客户端只需在特定目录中创建或编辑属性文件 那就太好了 这是一种比较常规的做事方式吗 还有比这更好的方法吗 我们经常通过提供 WAR 和 Co
  • Javascript对象:迭代属性[重复]

    这个问题在这里已经有答案了 我有一个变量 当打印到控制台时 它看起来像这样 Object PK 34 PK 35 我向该变量添加一个 size 方法 Model value size function obj var size 0 key
  • 如何使用“prototype”函数正确编写 JavaScript 属性和方法?

    我正在尝试学习如何使用 javascript 原型创建和使用 javascript 属性和方法 但遇到了一些困难 在下面的代码中 我尝试创建一个名为 radius 的简单对象 其半径为 4 并具有一个名为 getCircumference
  • 访问自动属性中的支持字段

    有什么方法可以访问属性的支持字段以进行验证 更改跟踪等 像下面这样的事情可能吗 如果没有 是否有计划将其纳入 NET 4 C 4 public string Name get set if value
  • 托管对象中的标量类型仅适用于 iPhone 5

    属性 Latitude 是 LatitudeLongitude 类的标量类型 无法为其生成 setter 方法 当我为托管对象生成代码时 我收到一条消息 询问是否需要原始数据类型的标量属性 我应该使用它吗 我想让这个应用程序与 iPhone
  • iOS——codeSense 中自动合成属性的“添加”方法

    我刚刚创建了一个具有以下属性的 iOS 类 property nonatomic strong NSString foo property nonatomic strong NSObject bar property nonatomic C
  • 我可以重写 C# 中的属性吗?如何?

    我有这个基类 abstract class Base public int x get throw new NotImplementedException 以及以下后代 class Derived Base public int x get
  • vue组件设置child的数据值

    我正在使用 vue 轮播 https ssense github io vue carousel api https ssense github io vue carousel api 它运行良好 但我需要重置轮播 我可以看到当前页面有一个

随机推荐