范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

使用Clangd提升C代码编写体验

  作者:jinshang,腾讯WXG后台开发工程师
  | 导语   工欲善其事,必先利其器。LLVM项目推出的Clangd拥有稳定的体验、完善的功能和活跃的社区,它作为一个稳定高效的C++代码插件可以成倍地提升我们的代码编写体验,是每个C++程序员提升代码效率的不二之选。 简介
  C++是一门通用的语言,你可以用C++写各式各样的程序,就像C++维基百科第一段话所说
  C++ 是一种被广泛使用的计算机程序设计语言。它是一种通用程序设计语言,支持多重编程范式,例如过程化程序设计、数据抽象)、面向对象程序设计、泛型程序设计和设计模式)等。
  C++的通用性使它不可避免地成为了一门复杂的语言,尤其是在"现代"C++诞生之后,C++标准委员会源源不断地向C++加入新特性。不可否认,自由度和多面性正是C++的魅力所在,但是它们也大大地增加了C++程序员们的心智负担,在C++11之前,也许《21天精通C++》还存在些许的可能性(这本书并不存在,我瞎编的),但是等再过几年C++20成为主流后,《21年精通现代C++》也许会成为下一本畅销书。(关于现代C++好用的特性,可以阅读我的这篇文章:C++17在业务代码中最好用的十个特性。
  C++变得越来越难写,但编译器们却不会阻止我们写出五花八门的代码,gcc、clang也不会像rustc一样对你的代码指指点点,只会任由你的程序放飞自我。对于Jeff Dean这样的大神来说这是自然而然的,毕竟从来都是他警告编译器(这是Jeff Dean的众多恶搞梗之一,参考:https://www.zhihu.com/question/22081653/answer/20593104)。而对于我们这些还没有"精通"C++的程序员来说,如果有一个实时的C++代码检查工具在我们写代码的同时在旁边指指点点,教我们写代码,它无疑可以大大提升我们的编程效率和体验。
  在业界,C++常用的代码检查工具有cpplint,coverity,clang-tidy(clangd背后也是通过clang-tidy检查,这里是指clang-tidy二进制本身独立使用)等,它们往往无法兼顾代码检查的完整性和实时性。如果要做到完整检查,就需要编译代码,通过代码的IR表示去分析逻辑流,比如coverity,这种检查往往是CI/CD流水线的一部分,不能实时检查。而cpplint则是不编译代码,这是通过词法分析,检查代码格式不符合标准的地方或者局部的问题,没有办法检测代码的逻辑错误。如果要兼顾完整性和实时性,就需要一个编译器在后台实时地编译我们的代码,而clangd恰好就提供这种功能。什么是clangd
  clangd是llvm项目推出的C++语言服务器,通过LSP(Language Server Protocal)协议向编辑器如vscode/vim/emacs提供语法补全、错误检测、跳转、格式化等等功能。C++的LSP曾经是cquery, ccls, clangd三足鼎立。但是clangd支持clang-tidy实时检查的功能是另外两者不具备的,而且cquery和ccls都是单个开发者主导的项目,clangd背后则是有llvm的背书。目前来看,"姓赵"的clangd在这场c++ lsp赛跑中已经有了不小的领先优势。clangd提供的特色功能
  除了报错、跳转、代码补全这些大家都有的功能外,clangd还提供一些非常好用的特色功能。自动插入头文件
  clangd的代码补全可以搜索你的整个代码库,即使是没有被include进来的变量也会覆盖到。而且在补全时,它会自动帮你填上合适的namespace和头文件:
  clang-format
  业界大型的C++代码项目一般都会自带clang-format配置,作为clang家族的一员,clangd可以提供自动的clang-format格式化:
  类型提示
  从clangd-14开始,clangd提供变量自动的类型提示,从此可以大胆地使用auto了:
  Clang-tidy代码检查
  先上一组效果图,看看clangd都能实时检测出哪些问题,错误最后标注了(fix available)的都是clangd可以自动修复的问题:
  1.性能问题,如多余的拷贝,无效的move,低效的算法等:
  2.潜在的错误,如use-after-move,无限循环,错误算法等:
  3.可读性问题,如隐式bool转换,函数参数不统一,变量命名规则等:
  4.现代化C++,如使用auto,using,override等现代C++特性:
  (vscode + Community Material配色 + Error Lens插件,Error Lens插件用于将错误提示直接展示在代码后)如何使用安装
  clangd有三种安装方式:
  系统包管理:如mac系统可使用brew install llvm  ,debian/ubuntu可使用sudo apt-get install clangd-14   等等
  手动下载二进制:可以在https://github.com/clangd/clangd/releases/tag/15.0.0手动下载最新版本的二进制
  手动编译:可以参考https://github.com/llvm/llvm-project/tree/main/clang-tools-extra/clangd#building-and-testing-clangd从源码编译
  个人更推荐后两种方式,因为最新的功能比如类型提示要在新版本的clangd才有配置编辑器
  以vscode为例,首先在插件市场安装clangd插件,接下来在vscode配置中添加如下几行"clangd.arguments": [     "--clang-tidy",                 // 开启clang-tidy     "--all-scopes-completion",      // 全代码库补全     "--completion-style=detailed",  // 详细补全     "--header-insertion=iwyu",           "--pch-storage=disk",           // 如果内存够大可以关闭这个选项     "--log=error",     "--j=5",                        // 后台线程数,可根据机器配置自行调整     "--background-index"   ], "clangd.path": "<安装的clangd地址>",  "[cpp]": {     "editor.defaultFormatter": "llvm-vs-code-extensions.vscode-clangd" },项目配置
  clangd需要知道如何编译你的项目,因此需要一个"编译数据库",通常情况下我们需要向clangd提供一个compile_commands.json文件,这个文件的生成需要依赖你的编译系统:
  CMAKE:cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1   添加这个参数即可
  BAZEL:https://github.com/hedronvision/bazel-compile-commands-extractor可以使用这个插件
  其他:大多数编译系统都会提供自己的compile commands生成方式,如果没有,或者是很老的项目,则可以通过https://github.com/rizsotto/Bear插件获取
  WXG Patchbuild:微信的patchbuild自带支持compile_commands.json生成,在正常的编译命令后加上--download-genfiles --compile-command-query=--merge  后运行,patchbuild会把当前目标的compile_commands.json生成,并与本地的~/QQMail/compile_commands.json  合并,供clangd使用:patchbuild build --download-genfiles --compile-command-query=--merge :<目标>
  对于每一个源文件,clangd会自动向上层,以及每层的build文件夹寻找compile_commands.json,如果你生成的文件在其他地址,可以通过ln -s ~/myproject-build/compile_commands.json ~/myproject/   创建软连接解决。clang-tidy配置
  clang-tidy的各项检查可以通过一个配置文件配置,在项目的根目录下添加一个.clang-tidy  (这就是文件名,".clang-tidy"),可以参考我的,然后根据需求自己搭配:--- Checks: >   -*,   bugprone-*,   google-*,   misc-*,   modernize-*,   performance-*,   portability-*,   readability-*,   -modernize-use-trailing-return-type,   -bugprone-lambda-function-name,   -google-runtime-references,   -readability-magic-numbers,   -bugprone-easily-swappable-parameters,   -readability-identifier-length,   -bugprone-narrowing-conversions, # Turn all the warnings from the checks above into errors. WarningsAsErrors: "performance-*, bugprone-*"  CheckOptions:   - { key: readability-identifier-naming.NamespaceCase, value: lower_case }   - { key: readability-identifier-naming.ClassCase, value: CamelCase }   - { key: readability-identifier-naming.StructCase, value: CamelCase }   - { key: readability-identifier-naming.TemplateParameterCase, value: aNy_CasE }   - { key: readability-identifier-naming.FunctionCase, value: aNy_CasE }   - { key: readability-identifier-naming.VariableCase, value: lower_case }   - { key: readability-identifier-naming.ClassMemberCase, value: lower_case }   - { key: readability-identifier-naming.ClassMemberSuffix, value: _ }   - { key: readability-identifier-naming.PrivateMemberSuffix, value: _ }   - { key: readability-identifier-naming.ProtectedMemberSuffix, value: _ }   - { key: readability-identifier-naming.EnumConstantCase, value: CamelCase }   - { key: readability-identifier-naming.EnumConstantPrefix, value: k }   - { key: readability-identifier-naming.ConstexprVariableCase, value: CamelCase }   - { key: readability-identifier-naming.ConstexprVariablePrefix, value: k }   - { key: readability-identifier-naming.GlobalConstantCase, value: CamelCase }   - { key: readability-identifier-naming.GlobalConstantPrefix, value: k }   - { key: readability-identifier-naming.MemberConstantCase, value: CamelCase }   - { key: readability-identifier-naming.MemberConstantPrefix, value: k }   - { key: readability-identifier-naming.StaticConstantCase, value: CamelCase }   - { key: readability-identifier-naming.StaticConstantPrefix, value: k }   - { key: misc-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic, value: 1 }   - { key: readability-function-cognitive-complexity.Threshold, value: 100 }
  对于每一项配置的含义,可以参考:https://clang.llvm.org/extra/clang-tidy/checks/list.html
  同时也可以参考开源项目的配置,如google cloud的:https://github.com/googleapis/google-cloud-cpp/blob/main/.clang-tidy 或者apache arrow的:https://github.com/apache/arrow/blob/master/.clang-tidyclang-format配置
  同理,在项目根目录下添加.clang-format文件,用与clangd自动格式化,可以参考开源项目的修改,比如:https://github.com/googleapis/google-cloud-cpp/blob/main/.clang-format和https://github.com/apache/arrow/blob/master/.clang-format总结
  工欲善其事,必先利其器。LLVM项目推出的Clangd拥有稳定的体验、完善的功能和活跃的社区,它作为一个稳定高效的C++代码插件可以成倍地提升我们的代码编写体验,是每个C++程序员提升代码效率的不二之选。

中超海港队跌落神坛,13宣告争冠失败,洋帅莱科难辞其咎中超联赛第22轮上演一场焦点大战,山东泰山31战胜上海海港,联赛打完22轮之后,终于追平了与武汉三镇的积分差距,中超争冠的悬念又回来了。输掉了这场比赛之后,上海海港队的积分停留在4辈分太乱!胡尔克晒妻儿全家福,前妻侄女抱6个月女儿,4个孩子2代人10月31日消息,日前,效力米内罗竞技的巴西前锋胡尔克在社交媒体上分享了与妻儿的幸福合照,值得一提的是,他的第二任妻子也是前妻的侄女,几个孩子的辈分有点乱!胡尔克的结发妻子叫伊兰索张继科疑婚事将近!与女友相处像老夫老妻,深夜约会后同回男方家张继科作为我国知名运动员,他的一生可是为我国体育事业创造了无数成绩与奇迹,目前靠着他的努力发展,为我们祖国争光,成为大家关注的运动员之外,其实关于他的感情问题,也一直是各位网友们关穆里尼奥拒绝迪巴拉回归,罗马太ampampquot卷ampampquot了,都拼到感动自己穆里尼奥到底施展了什么魔法,这是支什么球队,你可以说他是中游水平,也可以说狼崽们技术糙,但红狼军团的精神面貌,斗志拼劲,凝聚力,真的是令人咋舌,或者说是太卷了,都拼到感动自己。先说正式解约!42分12板12助10断!四双王退出CBACBA第一阶段结束,上海男篮仅取得3胜6负,目前排名联盟第15位。据欧洲篮球记者EmilianoCarchia报道,外援贾马尔富兰克林已经跟上海队解约。富兰克林决定前往欧洲打球,他女足的白色短裤,为什么那么惹人嫌?曼城女足联手Puma宣布,在本赛季接下来的比赛中,队伍将把原本的白色短裤换掉,改成采用天蓝色球衣搭配酒红色短裤的队服。在这之前,西布朗斯托克利文斯顿女足都也宣布了要换掉队服中的白色CBA三消息上海有意知名经理,林书豪回到广州,布莱克尼得分王大家好呀,我是北柠,各位小伙伴们要养成先看后赞的习惯哦!上海队这个赛季的表现确实让球迷们非常失望,主要原因是球队的投入和他们打出的成绩完全不相符,对于上海队来说,他们的目标不仅仅是中央电视台录播10月30日至11月6日乒乓球比赛安排头条创作挑战赛10月31日(周一)CCTV52205实况录像(奥林匹克)2022年世乒联世界杯决赛1CCTV51930实况录像(奥林匹克)2022年世乒联世界杯决赛女单决赛2025英超前六点评阿森纳曼城你追我赶,纽卡斯尔取利物浦而代之20222023赛季英超联赛在第14轮比赛结束之后,由于英女皇去世导致各队都有12场比赛延期举行,目前各队的比赛场次都在12场到13场之间,正好是本赛季英超赛程的13左右,特别是英富兰克林宣布离队我和上海队已正式决定友好分开央视网消息北京时间10月30日,上海男篮外援富兰克林发文,宣布他和上海队已经正式决定友好分开。富兰克林在社媒上写道致所有的球迷朋友和队友我和上海久事大鲨鱼已经正式决定友好分开。去年不服!上港跟队记者泰山很强?如果武磊那球进了,或能改写比赛1比3输球!在这次中超强强对话当中,全中超投入第一的上港饮恨败北,挟7比0狂胜之威却被中超积分榜排名第二的山东泰山三板斧战术击败,犹如被当头泼了一盘冷水。比赛是输了,不过有上港跟队
你知道长春市的十大名菜都有哪些吗?快来看看吧,满满的回忆每个地方都有其独特的美食,在长春人心中也是如此。这些美食既具有地域特色,又蕴含着满满的本土记忆和味道。酱骨头酱骨头是长春地区的一道传统菜肴,属于东北菜。酱骨头根据食材的不同,分为酱中秋,这6道菜安排起来!滋阴润燥,营养滋补,顺应季节,真好吃大家好,我是晓苹,一个喜欢在厨房钻研美食的宝妈,分享简单的食材,家常做法,感受家的味道。人间的烟火,一日三餐,喜欢关注食烟火味。苏轼的水调歌头描述中秋佳节明月几时有?把酒问青天。不1个中医民间验方,清热利尿消肿,治急性肾小球肾炎(急性肾炎)急性肾小球肾炎,简称为急性肾炎,有时也称为急性肾炎综合征。以急性起病血尿高血压水肿为主要特点,并常伴有少尿肾小球滤过减少等症状的肾小球疾病。中医认为,急性肾炎属于水肿中的风水肾水以中秋假期一日游路线,你被种草了吗?即将到来的中秋假期正是游玩的好时候今天,就给大家推荐一下泰安一日游路线喜欢的小伙伴可以参考一下啦路线一泰山泰山秀城泰山西湖路线二东平湖湿地公园水浒影视城戴村坝路线三新甫山良心谷01幼儿开学才3天,就被同学咬了,看了伤口真的是触目惊心呀新学期才开学3天。老师通知我们说你家小孩在学校被人给咬了。当时我心里就咯噔一下,然后我们就让老师发照片过来看看。看到的我当时一个气氛呀。你家小孩是属狗的吗。咬得那么凶,然后我们就去马斯克呼吁放弃混动车的背后,藏着日产电动化的机会今年中国新能源汽车市场最有意思的一件事,应该是比亚迪反超特斯拉,夺得上半年全球新能源车销冠。2022年上半年,比亚迪销量为64。14万辆,在全球新能源汽车市场中的占比达15。4。而欧锦赛意大利逆转淘汰塞尔维亚,字母末节收割芬兰波兰挺进八强北京时间9月12日,欧锦赛16进8的第二个淘汰日的四场比赛已经全部结束。意大利爆冷逆转塞尔维亚,字母哥末节发力带走比赛,马尔卡宁狂砍42分助队晋级八强,下面让我们一起来看看具体情况控制了生命膨胀空间,就控制或延长了时间控制了生命膨胀空间,就控制或延长了时间。宇宙本质宇宙是最大的生命体。是无限时空周而复始!宇宙是生命体,而生命体具体形式就是时空。宇宙是无限时空,宇宙是多元的。宇宙外还有宇宙。宇宙中太阳GM杜兰特的交易从未真正接近达成北京时间9月12日,据亚利桑那共和报报道,在杜兰特向篮网管理层申请交易之后,有传闻称他指定了两支希望加盟的球队太阳或者热火。不过近日太阳总经理詹姆斯琼斯透露,双方从未真正接近达成交就剩詹姆斯浓眉了,才两年啊!湖人冠军阵容彻底散了2020年洛杉矶湖人队拿到了NBA总冠军,这让他们的总冠军数追评了波士顿凯尔特人,成为了NBA历史上总冠军最多的球队之一。这也是湖人时隔10年之后又一次拿到总冠军,然而好景不长,湖美媒列出了球衣被多支球队退役的15名NBA球员,乔丹也仅两支而已我们都在讨论勒布朗詹姆斯的湖人球衣会不会退役,他有没有机会成为NBA历史上被三支球队退役的三名球员之一,毕竟NBA历史上能被多支球队退役球衣的球星并不多。因此,美媒Fadeaway