clang-format格式化工程代码

2023-05-16

zClang-Format

最近在考虑团队代码风格的问题,无意间发现了一个代码格式化神器“clang-format”工具

在了解clang-format工具之前,我们先来了解一下什么是clang,什么是LLVM,什么是GCC,什么又是GNU

GNU

从百度百科上可以看到,GNU是一个类unix操作系统,其内容软件完全以GPL协议发布。全称GNU’s Not Unix

GCC

gccegg-65

GCC是一套基于GNU系统开发的编译器,目前支持编译 C, C++, Objective-C,Fortran, Ada, Go, D等多种语言

其详细信息可以查看 GCC, the GNU Compiler Collection

LLVM

LLVM最初由美国UIUC大学的chris Lattner博士主持开展,之后Apple雇了Chris Lattner,LLVM相当于也就成了Apple官方支持的编译器。

LLVM提供了编译器的相关支持,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间、链接时间、运行时间、空闲时间。

其详情可以查看 The LLVM Compiler Infrastructure

clang

clang是一个由Apple主导编写的,以LLVM为后端的前端C、C++、Objective-C语言编译器,他具有如下优势

  • 编译速度快
  • 内存占用小
  • 兼容gcc

其详情可以查看 Clang: a C language family frontend for LLVM

clang-format

上面了解了一些基础知识点,现在开始本篇的主要内容介绍,使用clang-format工具格式化代码。本位以VSCode为例,作为讲解。

  1. 想要使用clang-format工具,我们需要一个名为“.clang-format”的配置文件,可以按照如下方法获取

    1. vscode安装C/C++扩展,扩展程序将自动安装clang-format

    2. 在vsc用户设置里面搜索clang,可以找到一个名为“C_Cpp: Clang_format_style”的选项,查看他的介绍,我们可以把代码格式化风格设置为如下几种

      • Visual Studio
      • LLVM
      • Google
      • Chromium
      • Mozilla
      • WebKit
      • file
    3. 如果将代码设置成file,那将从当前目录或父目录中的.clang-format文件来格式化代码

    4. 找到c/cc插件按照目录下的clang-format.exe工具,笔者的目录如下

      “C:\Users\\.vscode\extensions\ms-vscode.cpptools-1.5.1\LLVM\bin”

    5. 打开命令行,输入.\clang-format.exe -style=“llvm” -dump-config > .clang-format命令,即可获取到一个名为.clang-format的文件,把此文件放到工程代码的根目录下,即可生效。

      image-20210808144231050

  2. 如果需要定制自己代码格式化风格,可以按照 Clang-Format Style Options文章修改.clang-format内容

  3. 笔者的.clang-format配置如下

    ---
    Language: Cpp
    # BasedOnStyle:  LLVM
    AccessModifierOffset: -2
    AlignAfterOpenBracket: Align
    AlignConsecutiveMacros: AcrossEmptyLines
    AlignConsecutiveAssignments: AcrossEmptyLines
    AlignConsecutiveBitFields: AcrossEmptyLines
    AlignConsecutiveDeclarations: AcrossEmptyLines
    AlignEscapedNewlines: Left
    AlignOperands: Align
    AlignTrailingComments: true
    AllowAllArgumentsOnNextLine: true
    AllowAllConstructorInitializersOnNextLine: true
    AllowAllParametersOfDeclarationOnNextLine: true
    AllowShortEnumsOnASingleLine: false
    
    AllowShortBlocksOnASingleLine: false
    AllowShortCaseLabelsOnASingleLine: false
    AllowShortFunctionsOnASingleLine: false
    
    AllowShortLambdasOnASingleLine: All
    AllowShortIfStatementsOnASingleLine: false
    AllowShortLoopsOnASingleLine: false
    AlwaysBreakAfterDefinitionReturnType: None
    AlwaysBreakAfterReturnType: None
    AlwaysBreakBeforeMultilineStrings: false
    AlwaysBreakTemplateDeclarations: MultiLine
    AttributeMacros:
        - __capability
    BinPackArguments: false
    BinPackParameters: false
    
    BraceWrapping:
        AfterCaseLabel: true
        AfterClass: true
        AfterControlStatement: true
        AfterEnum: true
        AfterFunction: true
        AfterNamespace: true
        AfterObjCDeclaration: true
        AfterStruct: true
        AfterUnion: true
        AfterExternBlock: true
        BeforeCatch: true
        BeforeElse: true
        BeforeLambdaBody: true
        BeforeWhile: true
        IndentBraces: true
        SplitEmptyFunction: true
        SplitEmptyRecord: true
        SplitEmptyNamespace: true
    BreakBeforeBinaryOperators: None
    BreakBeforeConceptDeclarations: true
    BreakBeforeBraces: Allman
    BreakBeforeInheritanceComma: true
    BreakInheritanceList: BeforeColon
    BreakBeforeTernaryOperators: true
    BreakConstructorInitializersBeforeComma: false
    BreakConstructorInitializers: BeforeColon
    BreakAfterJavaFieldAnnotations: false
    BreakStringLiterals: false
    ColumnLimit: 80
    CommentPragmas: "^ IWYU pragma:"
    CompactNamespaces: false
    ConstructorInitializerAllOnOneLineOrOnePerLine: false
    ConstructorInitializerIndentWidth: 4
    ContinuationIndentWidth: 4
    Cpp11BracedListStyle: true
    DeriveLineEnding: true
    DerivePointerAlignment: false
    DisableFormat: false
    EmptyLineBeforeAccessModifier: LogicalBlock
    ExperimentalAutoDetectBinPacking: false
    FixNamespaceComments: true
    ForEachMacros:
        - foreach
        - Q_FOREACH
        - BOOST_FOREACH
    StatementAttributeLikeMacros:
        - Q_EMIT
    IncludeBlocks: Preserve
    IncludeCategories:
        - Regex: '^"(llvm|llvm-c|clang|clang-c)/'
          Priority: 2
          SortPriority: 0
          CaseSensitive: false
        - Regex: '^(<|"(gtest|gmock|isl|json)/)'
          Priority: 3
          SortPriority: 0
          CaseSensitive: false
        - Regex: ".*"
          Priority: 1
          SortPriority: 0
          CaseSensitive: false
    IncludeIsMainRegex: "(Test)?$"
    IncludeIsMainSourceRegex: ""
    IndentCaseLabels: false
    IndentCaseBlocks: false
    IndentGotoLabels: true
    IndentPPDirectives: BeforeHash
    IndentExternBlock: AfterExternBlock
    IndentRequires: false
    IndentWidth: 2
    IndentWrappedFunctionNames: false
    InsertTrailingCommas: None
    JavaScriptQuotes: Leave
    JavaScriptWrapImports: true
    KeepEmptyLinesAtTheStartOfBlocks: false
    MacroBlockBegin: ""
    MacroBlockEnd: ""
    MaxEmptyLinesToKeep: 1
    NamespaceIndentation: None
    ObjCBinPackProtocolList: Auto
    ObjCBlockIndentWidth: 2
    ObjCBreakBeforeNestedBlockParam: true
    ObjCSpaceAfterProperty: false
    ObjCSpaceBeforeProtocolList: true
    PenaltyBreakAssignment: 2
    PenaltyBreakBeforeFirstCallParameter: 19
    PenaltyBreakComment: 300
    PenaltyBreakFirstLessLess: 120
    PenaltyBreakString: 1000
    PenaltyBreakTemplateDeclaration: 10
    PenaltyExcessCharacter: 1000000
    PenaltyReturnTypeOnItsOwnLine: 60
    PenaltyIndentedWhitespace: 0
    PointerAlignment: Right
    ReflowComments: true
    SortIncludes: false
    SortJavaStaticImport: Before
    SortUsingDeclarations: false
    SpaceAfterCStyleCast: false
    SpaceAfterLogicalNot: false
    SpaceAfterTemplateKeyword: true
    SpaceBeforeAssignmentOperators: true
    SpaceBeforeCaseColon: false
    SpaceBeforeCpp11BracedList: true
    SpaceBeforeCtorInitializerColon: true
    SpaceBeforeInheritanceColon: true
    SpaceBeforeParens: ControlStatements
    SpaceAroundPointerQualifiers: Default
    SpaceBeforeRangeBasedForLoopColon: true
    SpaceInEmptyBlock: false
    SpaceInEmptyParentheses: false
    SpacesBeforeTrailingComments: 1
    SpacesInAngles: false
    SpacesInConditionalStatement: false
    SpacesInContainerLiterals: true
    SpacesInCStyleCastParentheses: false
    SpacesInParentheses: false
    SpacesInSquareBrackets: false
    SpaceBeforeSquareBrackets: false
    BitFieldColonSpacing: Both
    Standard: Latest
    StatementMacros:
        - Q_UNUSED
        - QT_REQUIRE_VERSION
    TabWidth: 4
    UseCRLF: false
    UseTab: Never
    WhitespaceSensitiveMacros:
        - STRINGIZE
        - PP_STRINGIZE
        - BOOST_PP_STRINGIZE
        - NS_SWIFT_NAME
        - CF_SWIFT_NAME
    ---
    

笔者留言:

​ 笔者正在嵌入式学习路上摸爬滚打 💪

​ 对于一些知识点的理解难免会有出入,还请读者不吝赐教 ✋

​ github地址 🙏

扫码关注微信公众号 🙏

image-20210808145651937

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

clang-format格式化工程代码 的相关文章

  • 融合乘加和默认舍入模式

    使用 GCC 5 3 可以编译以下代码 O3 fma float mul add float a float b float c return a b c 产生以下程序集 vfmadd132ss xmm1 xmm2 xmm0 ret 我注意
  • 如何在 Xcode 中禁用一个文件的优化

    我的 Xcode 项目依赖于另一个库 当我使用以下命令构建项目时 这会导致项目出现错误 O3 option 这些错误仅存在于一个文件中 所以我想关掉 O3 该文件的选项 是否可以 打开目标 看下Build Phases 打开Compile
  • 指定不同访问器中静态局部变量的构造/销毁顺序

    我遇到了崩溃cxa finalize运行一个程序 这是一个程序 而不是其中的库 ac test exe Assertion failed AcLock cpp 54 AcLock libc abi dylib terminate calle
  • 如何使用 Python 从 Excel 文件中提取单元格格式(粗体、斜体等)?

    我试图从 Excel 文件中提取单元格的内容 本质上是文本 和文本的格式 我正在处理的 Excel 看起来像下面的屏幕截图 单元格中的文本可能是粗体 斜体或笔划 我需要将文本和格式提取到 python 字符串中 例如 如果单元格包含 lin
  • SSIS 包损坏,错误为 0xC00CE504

    我有一个损坏的 SSIS 包 并显示错误消息 由于错误 0xC00CE504 名称以无效字符开头 第 13 行第 2 列 无法加载 XML 当加载包并且文件无法打开或无法正确加载到 XML 文档时会发生这种情况 这可能是由于向 LoadPa
  • Python 格式化小数,具有最少小数位数

    我有一些DecimalPython 中的实例 我希望将它们格式化为 Decimal 1 gt 1 00 Decimal 12 0 gt 12 00 Decimal 314 1 gt 314 10 Decimal 314 151 gt 314
  • 解决 emacs 错误的想法:“应用:生成子进程:exec 格式错误”

    我正在尝试将 rdebug 与 emacs 和 cygwin 一起使用 但遇到了麻烦 每当我执行 M x rdebug 并为其提供适当的脚本来运行时 它都会因错误而停止 apply Spawning child process exec f
  • 让 clang-tidy 修复头文件

    我正在将当前使用 gcc 编译的项目移至 clang 并有一堆 gcc 没有生成的警告 Winconsistent missing override clang tidy致力于修复这些错误 cpp文件 但是它不触及hpp文件 因为在数据库中
  • python string format() 与带有整数键的字典[重复]

    这个问题在这里已经有答案了 我想使用Python字符串format 充当快速而肮脏的模板 但是 那dict我想使用的键是整数 字符串表示形式 一个简化的例子如下 s hello there 5 d 5 you s format d 上面的代
  • __attribute__ ((已弃用)) 不适用于 Objective-C 协议方法?

    我需要弃用 Objective C 协议中的单个方法 在普通的类 实例方法上我添加 attribute deprecated 声明后 看来它不适用于协议方法 如果我将它们标记为已弃用并在某个地方使用它们 则项目编译正常 不会出现预期的弃用警
  • Lisp 格式和强制输出

    我不明白为什么这段代码在不同的实现中表现不同 format t asdf setq var read 在 CLISP 中 它的行为与预期一致 先打印提示 然后读取 但在 SBCL 中 它显示 then输出 我在网上查了一下 修改了一下 fo
  • 如何仅将列表中每个字符串的标题大写?

    整个问题 编写一个函数 该函数将字符串列表作为参数 并返回一个包含每个大写字符串作为标题的列表 也就是说 如果输入参数是 apple pie brownies chocolate dulce de leche eclairs 你的函数应该返
  • 文件上传控件仅上传PDF

    我有一个像这样的文件控件 div class form group Html LabelFor m gt m File new class col md 2 control label div class col md 10 Html Te
  • Windows 铿锵声Hello World lnk4217

    我已经安装了 clang 版本 6 0 以及 Visual Studio 2017 我正在编译一个简单的 hello world 应用程序 include
  • java格式化表格输出

    所以我正在尝试格式化我的输出 System out println Menu nItem tItem t tPrice tQuantity for int i 0 i
  • C++11 的 LLVM&Clang 支持

    我有一些为 MS VC 10 编写的代码 我使用 C 11 特别是像这样的表达式 std function
  • 找不到“Attributes.inc”文件

    我一直在使用中提供的标题include llvm and include llvm c尝试制作我自己的编译器 但是 每当我尝试编译时 都会收到此错误 没有llvm IR Attributes inc在我的文件或我见过的任何 LLVM 项目中
  • mysql 如何比较 dd-mon-yy 格式的日期

    如何比较格式中的日期dd mon yy 例如 2014 年 11 月 10 日 gt 2013 年 10 月 7 日 select expiration date from grocery where expiration date lt
  • 如何在 conda 中静音或抑制 gfortran (或 clang?)后端?

    我一直致力于构建一个非常特殊的 conda 环境 专为python and R与串扰使用rpy2 我想出的方法可以安装正确的R包如下 install main environment sh now date T echo Start Tim
  • matplotlib 后端对渲染格式有什么限制?

    我对 matplotlib 使用的后端在确定可以呈现哪些格式方面所扮演的角色感到困惑 例如 文件说 http matplotlib org faq usage faq html what is a backend agg 后端生成 PNG

随机推荐

  • MobaXterm 远程linux服务器图像界面打不开

    如图所示 xff0c 本人用的是 MobaXterm软件 远程连接linux系统 xff0c 但是显示图形界面的时候 这里无法显示 xff0c 报错 xff1a demo 895 Gtk WARNING 23 06 41 170 canno
  • linux+opencv 将摄像头视频通过UDP协议发送给服务器端并显示

    我这边有一块rock3a开发板 xff0c 并童工USB接口外接一个USB 海康威视高清摄像头 200万像素 首先源码编译aarch版本的opencv xff0c 之前的博客中有讲 xff0c 这里不再赘述 进入linux开发界面 xff0
  • ROS入门之Cmakelist说明

    Cmakelist http wiki ros org catkin CMakeLists txt 1 Overall Structure and Ordering Your CMakeLists txt file MUST follow
  • DELL 暗夜精灵无法进入BIOS系统

    1 1 开始菜单 设置 2 单击 更新和安全 3 单击右边列表项中的 恢复 4 单击左侧的 立即重启 xff0c 这时电脑就会立即重启 xff0c 所以单击前请保存好未保存文件 5 当电脑重启之后会进入如下界面 xff0c 单击 疑难解答
  • Simulink永磁同步电机控制仿真系列八:使用自抗扰控制(adrc)实现速度闭环以及扰动估计

    引言 最近对环路进行了一些思考 xff0c 我们知道对于永磁同步电机的电流环控制 xff0c 往往假定电流环的控制对象是电阻和电感的串联 xff0c 这样的一个系统开环响应类似于一阶惯性系统 xff0c 适合使用pi控制 xff0c 并且可
  • STM32之RTC实时时钟

    RTC实时时钟简介 STM32的RTC外设 实质是一个掉电后还继续运行的定时器 从定时器的角度来看 相对于通用定时器TIM外设 它的功能十分简单 只有计时功能 也可以触发中断 但是从掉电还能继续运行来看 它是STM32中唯一一个具有这个功能
  • VS2019 错误 MSB8066 自定义生成已退出,代码为 3

    最近使用VS2019调试一个项目 xff0c 一直遇到以下错误 xff1a 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 MSB8066 D MyItems CDMatrix Build CMakeFiles 3800edc586
  • RTOS与linux区别

    一句话解释 xff1a linux是分时系统 xff0c 不过可以通过配置内核改成实时 嵌入式Linux 系统是在原来Linux的发行版本之上进行了优化和改进的 xff0c 用于嵌入式的移动终端等设备的嵌入式Linux系统现在基本上都是实时
  • QT绘图控件QWT的安装及配置

    1 QWT库下载 解压下载的压缩包 xff0c 我们可以看到里面包含多个文件夹 有源码 有参考程序 有说明文档等等 xff0c 有时间建议把参考程序都看一下 xff0c 这样都每个控件有什么功能都很熟悉 2 QWT编译 网上介绍QWT编译有
  • QT多线程的使用(moveToThread方法)

    QT有两种实现多线程的方法 xff0c 一种是 子类化QThread xff0c 然后去重写run函数 xff0c 实现多线程 一种是 子类化QObject xff0c 然后使用moveToThread函数实现多线程 由于QT官方推荐使用第
  • 嵌入式Linux学习1——Linux常用指令1

    写在前面 xff1a Linux本系列的所有学习内容都是我在购买 正点原子Alpha Linux开发板 后 xff0c 根据官方提供的资料 整理而来 后面将不再做介绍 目录 ls xff1a 用于显示当前目录下的内容 a xff1a 显示当
  • 嵌入式Linux学习2——Linux常用指令2

    目录 touch xff1a touch命令用来创建空文件 cp xff1a cp命令用来复制文件或目录 rm xff1a rm命令用于删除一个文件或者目录 mkdir xff1a 用于创建文件夹 mv xff1a mv命令用来为文件或目录
  • 基于STM32分析栈、堆、全局区、常量区、代码区、RAM、ROM

    目录 总体介绍 栈区 xff08 stack xff09 堆区 xff08 heap xff09 全局区 xff08 静态区 xff09 bss段 data段 常量区 代码区 RAM和ROM Flash Memory的物理特性 RAM RO
  • VS2013(Visual Studio 2013)官方中文旗舰版安装激活方法

    dio 2013旗舰版 VS2013 xff08 Visual Studio 2013 xff09 官方中文旗舰版安装激活方法 1 下载后得到的是ISO文件 xff0c 直接解压缩或用虚拟光驱加载运行都可以 2 无所不藏在这里直接解压 xf
  • git服务器(gitea)安装说明

    需要用到的软件 需要用到的软件有 gitea 1 12 3 windows 4 0 amd64 exenssm exeGit 2 28 0 64 bit exe 这些软件的具体功能在后面安装的时候会提及 软件都已经放到了 软件包 文件夹中
  • 实战篇 | 基于freeRTOS的多任务事件传输demo(附代码)

    之前分享了很多关于freeRTOS的知识 xff0c 那么我们怎么在实战中去写代码呢 xff1f 本篇文章重在对基于freeRTOS的架构代码的解析 整个功能如下图 xff1a 为什么要用freeRTOS 在实际项目中 xff0c 如果程序
  • FMCW-距离估计

    距离估计 FMCW雷达工作原理 如上图所示 xff0c 圈1是一个信号产生器 xff0c 用于产生一个线性调频脉冲信号 xff08 频率随时间义线性方式增长的正弦波 xff09 xff0c 经圈2发射天线发送出去 xff0c 并且和圈3接收
  • 卡尔曼滤波器从入门到放弃

    目录 前言 个人总结 总结卡尔曼滤波器使用流程 从一维卡尔曼滤波器 不带过程噪声的一维卡尔曼滤波器 EXAMPLE 5 ESTIMATING THE HEIGHT OF A BUILDING 数值例子 xff1a 一维卡尔曼滤波器的完整模型
  • IAR下载算法制作

    IAR下载算法制作 作者 Lucas 时间 2020 12 06 17 06 18 摘要 本文档主要介绍如何在IAR环境下制作QSPI下载算法 本文使用到的硬件 软件如下 编译器 xff1a IAR 8 32 单片机 xff1a STM32
  • clang-format格式化工程代码

    zClang Format 最近在考虑团队代码风格的问题 xff0c 无意间发现了一个代码格式化神器 clang format 工具 在了解clang format工具之前 xff0c 我们先来了解一下什么是clang xff0c 什么是L