IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> clang-format格式化工程代码 -> 正文阅读

[C++知识库]clang-format格式化工程代码

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

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-09 13:40:22  更:2021-08-09 13:40:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/9 15:58:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码