Linux下Clang-format代码格式化

2023-05-16

/**

    * @author wangdaopo

    * @email 3168270295@qq.com

    */

1.Clang-format 代码格式化介绍

平时团队进行合作的时候需要注意代码的格式,虽然很难统一每个人的编码风格,但是通过工具能够很好的管理代码格式。这里介绍下clang-format,它是基于clang的一个命令行工具,能够自动化格式C/C++/Obj-C代码,支持多种代码风格:Google, Chromium, LLVM, Mozilla, WebKit,也支持自定义风格(通过编写.clang-format文件)很方便的同意代码格式。

 

2.安装

 Linux下安装Clang-format : sudo apt-get install clang-format

vim 中也可以集成该插件

 

3. 使用方法  code review提交代码前统一每个人的编码风格

格式化风格可使用内置风格或使用参数文件指定风格:

$ clang-format -style=LLVM -i test.cc -style参数指定所选风格,可选项为 LLVM、Google、Chromium、Mozilla、WebKit 和 file,其中 file 指定参数文件。-i 表示将格式化后的内容写入原文件

 

另外clang-format还提供一个clang-format-diff.py脚本,用来格式化patch,code review提交代码前,可以先跑一下这个脚本,// 格式化最新的commit,并直接在原文件上修改

git diff -U0 HEAD^ | clang-format-diff -i -p1

 

4.如果要自定义风格,导出默认配置文件.clang-format 修改以下几项 操作步骤

1).clang-format 可使用如下命令生成: 可以对其中某一个导出的文件.clang-format 进行修改,实现自定义格式化:

$ clang-format -style=llvm -dump-config > .clang-format    # clang-format -style=格式名 -dump-config > 文件名

然后修改参数,以适应自己的要求。我习惯了 Linux kernel 风格,要修改以下几项:

 

若在当前目录或祖先目录中已有 .clang-format 文件,则可直接

$ clang-format -i test.cc

 

2)配置文件.clang-format详细说明

注:可能下面贴出的内容在个别选项上与官网文档不一样,这是由于Clang-Format的版本不一样的。
# 语言: None, Cpp, Java, JavaScript, ObjC, Proto, TableGen, TextProto
Language:    Cpp
# BasedOnStyle:    LLVM
# 访问说明符(public、private等)的偏移
AccessModifierOffset:    -4
# 开括号(开圆括号、开尖括号、开方括号)后的对齐: Align, DontAlign, AlwaysBreak(总是在开括号后换行)
AlignAfterOpenBracket:    Align
# 连续赋值时,对齐所有等号
AlignConsecutiveAssignments:    true
# 连续声明时,对齐所有声明的变量名
AlignConsecutiveDeclarations:    true
# 左对齐逃脱换行(使用反斜杠换行)的反斜杠
AlignEscapedNewlinesLeft:    true
# 水平对齐二元和三元表达式的操作数
AlignOperands:    true
# 对齐连续的尾随的注释
AlignTrailingComments:    true
# 允许函数声明的所有参数在放在下一行
AllowAllParametersOfDeclarationOnNextLine:    true
# 允许短的块放在同一行
AllowShortBlocksOnASingleLine:    false
# 允许短的case标签放在同一行
AllowShortCaseLabelsOnASingleLine:    false
# 允许短的函数放在同一行: None, InlineOnly(定义在类中), Empty(空函数), Inline(定义在类中,空函数), All
AllowShortFunctionsOnASingleLine:    Empty
# 允许短的if语句保持在同一行
AllowShortIfStatementsOnASingleLine:    false
# 允许短的循环保持在同一行
AllowShortLoopsOnASingleLine:    false
# 总是在定义返回类型后换行(deprecated)
AlwaysBreakAfterDefinitionReturnType:    None
# 总是在返回类型后换行: None, All, TopLevel(顶级函数,不包括在类中的函数), 
#   AllDefinitions(所有的定义,不包括声明), TopLevelDefinitions(所有的顶级函数的定义)
AlwaysBreakAfterReturnType:    None
# 总是在多行string字面量前换行
AlwaysBreakBeforeMultilineStrings:    false
# 总是在template声明后换行
AlwaysBreakTemplateDeclarations:    false
# false表示函数实参要么都在同一行,要么都各自一行
BinPackArguments:    true
# false表示所有形参要么都在同一行,要么都各自一行
BinPackParameters:    true
# 大括号换行,只有当BreakBeforeBraces设置为Custom时才有效
BraceWrapping:   
  # class定义后面
  AfterClass:    false
  # 控制语句后面
  AfterControlStatement:    false
  # enum定义后面
  AfterEnum:    false
  # 函数定义后面
  AfterFunction:    false
  # 命名空间定义后面
  AfterNamespace:    false
  # ObjC定义后面
  AfterObjCDeclaration:    false
  # struct定义后面
  AfterStruct:    false
  # union定义后面
  AfterUnion:    false
  # catch之前
  BeforeCatch:    true
  # else之前
  BeforeElse:    true
  # 缩进大括号
  IndentBraces:    false
# 在二元运算符前换行: None(在操作符后换行), NonAssignment(在非赋值的操作符前换行), All(在操作符前换行)
BreakBeforeBinaryOperators:    NonAssignment
# 在大括号前换行: Attach(始终将大括号附加到周围的上下文), Linux(除函数、命名空间和类定义,与Attach类似), 
#   Mozilla(除枚举、函数、记录定义,与Attach类似), Stroustrup(除函数定义、catch、else,与Attach类似), 
#   Allman(总是在大括号前换行), GNU(总是在大括号前换行,并对于控制语句的大括号增加额外的缩进), WebKit(在函数前换行), Custom
#   注:这里认为语句块也属于函数
BreakBeforeBraces:    Custom
# 在三元运算符前换行
BreakBeforeTernaryOperators:    true
# 在构造函数的初始化列表的逗号前换行
BreakConstructorInitializersBeforeComma:    false
# 每行字符的限制,0表示没有限制
ColumnLimit:    200
# 描述具有特殊意义的注释的正则表达式,它不应该被分割为多行或以其它方式改变
CommentPragmas:    '^ IWYU pragma:'
# 构造函数的初始化列表要么都在同一行,要么都各自一行
ConstructorInitializerAllOnOneLineOrOnePerLine:    false
# 构造函数的初始化列表的缩进宽度
ConstructorInitializerIndentWidth:    4
# 延续的行的缩进宽度
ContinuationIndentWidth:    4
# 去除C++11的列表初始化的大括号{后和}前的空格
Cpp11BracedListStyle:    false
# 继承最常用的指针和引用的对齐方式
DerivePointerAlignment:    false
# 关闭格式化
DisableFormat:    false
# 自动检测函数的调用和定义是否被格式为每行一个参数(Experimental)
ExperimentalAutoDetectBinPacking:    false
# 需要被解读为foreach循环而不是函数调用的宏
ForEachMacros:    [ foreach, Q_FOREACH, BOOST_FOREACH ]
# 对#include进行排序,匹配了某正则表达式的#include拥有对应的优先级,匹配不到的则默认优先级为INT_MAX(优先级越小排序越靠前),
#   可以定义负数优先级从而保证某些#include永远在最前面
IncludeCategories: 
  - Regex:    '^"(llvm|llvm-c|clang|clang-c)/'
    Priority:    2
  - Regex:    '^(<|"(gtest|isl|json)/)'
    Priority:    3
  - Regex:    '.*'
    Priority:    1
# 缩进case标签
IndentCaseLabels:    false
# 缩进宽度
IndentWidth:    4
# 函数返回类型换行时,缩进函数声明或函数定义的函数名
IndentWrappedFunctionNames:    false
# 保留在块开始处的空行
KeepEmptyLinesAtTheStartOfBlocks:    true
# 开始一个块的宏的正则表达式
MacroBlockBegin:    ''
# 结束一个块的宏的正则表达式
MacroBlockEnd:    ''
# 连续空行的最大数量
MaxEmptyLinesToKeep:    1
# 命名空间的缩进: None, Inner(缩进嵌套的命名空间中的内容), All
NamespaceIndentation:    Inner
# 使用ObjC块时缩进宽度
ObjCBlockIndentWidth:    4
# 在ObjC的@property后添加一个空格
ObjCSpaceAfterProperty:    false
# 在ObjC的protocol列表前添加一个空格
ObjCSpaceBeforeProtocolList:    true
# 在call(后对函数调用换行的penalty
PenaltyBreakBeforeFirstCallParameter:    19
# 在一个注释中引入换行的penalty
PenaltyBreakComment:    300
# 第一次在<<前换行的penalty
PenaltyBreakFirstLessLess:    120
# 在一个字符串字面量中引入换行的penalty
PenaltyBreakString:    1000
# 对于每个在行字符数限制之外的字符的penalty
PenaltyExcessCharacter:    1000000
# 将函数的返回类型放到它自己的行的penalty
PenaltyReturnTypeOnItsOwnLine:    60
# 指针和引用的对齐: Left, Right, Middle
PointerAlignment:    Left
# 允许重新排版注释
ReflowComments:    true
# 允许排序#include
SortIncludes:    true
# 在C风格类型转换后添加空格
SpaceAfterCStyleCast:    false
# 在赋值运算符之前添加空格
SpaceBeforeAssignmentOperators:    true
# 开圆括号之前添加一个空格: Never, ControlStatements, Always
SpaceBeforeParens:    ControlStatements
# 在空的圆括号中添加空格
SpaceInEmptyParentheses:    false
# 在尾随的评论前添加的空格数(只适用于//)
SpacesBeforeTrailingComments:    2
# 在尖括号的<后和>前添加空格
SpacesInAngles:    true
# 在容器(ObjC和JavaScript的数组和字典等)字面量中添加空格
SpacesInContainerLiterals:    true
# 在C风格类型转换的括号中添加空格
SpacesInCStyleCastParentheses:    true
# 在圆括号的(后和)前添加空格
SpacesInParentheses:    true
# 在方括号的[后和]前添加空格,lamda表达式和未指明大小的数组的声明不受影响
SpacesInSquareBrackets:    true
# 标准: Cpp03, Cpp11, Auto
Standard:    Cpp11
# tab宽度
TabWidth:    4
# 使用tab字符: Never, ForIndentation, ForContinuationAndIndentation, Always
UseTab:    Never
...
 

 

  • # 基于那个配置文件
    BasedOnStyle: LLVM
    # 访问说明符的偏移(public private)
    AccessModifierOffset: -4
    # 括号之后,水平对齐参数: Align DontAlign AlwaysBreak
    AlignAfterOpenBracket: Align
    # 连续的赋值时,对齐所有的等号
    AlignConsecutiveAssignments: true
    # 连续声明时,对齐所有声明的变量名
    AlignConsecutiveDeclarations: true
    # 左对齐换行(使用反斜杠换行)的反斜杠 
    AlignEscapedNewlinesLeft: true
    # 水平对齐二元和三元表达式的操作数 
    AlignOperands: true
    # 对齐连续的尾随的注释  
    AlignTrailingComments: true
    # 允许函数声明的所有参数在放在下一行  
    AllowAllParametersOfDeclarationOnNextLine: true
    # 允许短的块放在同一行  
    AllowShortBlocksOnASingleLine : false
    # 允许短的case标签放在同一行
    AllowShortCaseLabelsOnASingleLine: false
    # 允许短的函数放在同一行: None, InlineOnly(定义在类中), Empty(空函数), Inline(定义在类中,空函数), All 
    AllowShortFunctionsOnASingleLine: Empty
    # 是否允许短if单行 If true, if (a) return; 可以放到同一行
    AllowShortIfStatementsOnASingleLine: false
    # 允许短的循环保持在同一行   
    AllowShortLoopsOnASingleLine: false 
    # 总是在定义返回类型后换行(deprecated)   
    AlwaysBreakAfterDefinitionReturnType: None
    # 每行字符的限制,0表示没有限制  
    ColumnLimit: 100
    # 描述具有特殊意义的注释的正则表达式,它不应该被分割为多行或以其它方式改变
    CommentPragmas: '^ IWYU pragma:'
    # 语言: None Cpp Java Objc Protp
    Language: Cpp 
    #指针的*的挨着哪边
    PointerAlignment: Right
    #缩进宽度
    IndentWidth: 4
    # 连续的空行保留几行
    MaxEmptyLinesToKeep: 1
    # 在 @property 后面添加空格, \@property (readonly) 而不是 \@property(readonly).
    ObjCSpaceAfterProperty: true
    # OC block后面的缩进
    ObjCBlockIndentWidth: 4
    # 是否允许短方法单行
    AllowShortFunctionsOnASingleLine: false
    # 换行的时候对齐操作符
    #AlignOperands: true
    # 中括号两边空格 [] 
    SpacesInSquareBrackets: true
    # 小括号两边添加空格
    SpacesInParentheses : false
    #等号两边的空格
    SpaceBeforeAssignmentOperators: true
    # 容器类的空格 例如 OC的字典
    SpacesInContainerLiterals: true
    #缩进
    IndentWrappedFunctionNames: true
    #在block从空行开始
    KeepEmptyLinesAtTheStartOfBlocks: true
    #在构造函数初始化时按逗号断行,并以冒号对齐
    BreakConstructorInitializersBeforeComma: true
    #括号后添加空格
    SpaceAfterCStyleCast: false
    # 允许排序#include, 造成编译错误
    # SortIncludes: true 
    # 缩进case 标签
    IndentCaseLabels: true 
    #tab键盘的宽度
    TabWidth: 4
    UseTab: Never

 

 

参考:

团队效率工具: 代码格式化之Clang-format  https://blog.csdn.net/z2066411585/article/details/82290477

.clang-format 文件具体参数设置参考:http://clang.llvm.org/docs/ClangFormatStyleOptions.html

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

Linux下Clang-format代码格式化 的相关文章

  • 基于浏览器位置/设置的 Angular 2 Datepipe 格式

    有没有办法使 datepipe 动态化 以便如果它是美国浏览器 则 d atepipe 返回美国格式 yyyy MM dd 而当它是欧洲浏览器时 它返回欧洲格式 dd MM yyyy Thanks 这可能很困难 尤其是在使用 aot 时 它
  • 强制 clang-format 根本不碰评论

    我故意在行的开头提供一些注释 例如一些调试代码 并且不想缩进这些行 我同意 clang format 根本不碰 评论 他们全部 我发现的唯一设置是ReflowComments false仍然可以识别评论 我没有找到任何不缩进注释的设置 如果
  • Linux:如何从特定端口发送TCP数据包?

    如何打开原始套接字以从特定 TCP 端口发送 我希望所有连接始终来自临时端口以下的一系列端口 如果您正在使用raw套接字 然后只需在数据包标头中填写正确的 TCP 源端口即可 相反 如果您使用 TCP 套接字接口 socket connec
  • 如何在 Windows 上的 Eclipse 中设置 Clang 工具链?

    我为一个愚蠢的问题道歉 但我在网上找不到答案 我正在努力为 64 位计算机上的 Windows 7 中的 Eclipse 设置 Clang 编译器 链接器 我对 C 的了解非常过时 并且从未在 Eclipse 中工作过 我想要实现的是在 W
  • SSE:跨页边界的未对齐加载和存储

    我在页面边界旁边执行未对齐加载或存储之前读过某处 例如使用 mm loadu si128 mm storeu si128内在函数 代码应首先检查整个向量 在本例中为 16 个字节 是否属于同一页 如果不属于同一页 则切换到非向量指令 我知道
  • 将 jar 作为 Linux 服务运行 - init.d 脚本在启动应用程序时卡住

    我目前正在致力于在 Linux VM 上实现一个可运行的 jar 作为后台服务 我已经使用了找到的例子here https gist github com shirish4you 5089019作为工作的基础 并将 start 方法修改为
  • 在我的 index.php 中加载 CSS 和 JS 等资源时出现错误 403

    我使用的是 Linux Elementary OS 并在 opt 中安装了 lampp My CSS and JS won t load When I inspect my page through browser The console
  • docker容器大小远大于实际大小

    我正在尝试从中构建图像debian latest 构建后 报告的图像虚拟大小来自docker images命令为 1 917 GB 我登录查看尺寸 du sh 大小为 573 MB 我很确定这么大的尺寸通常是不可能的 这里发生了什么 如何获
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl
  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute
  • 如何减去两个 gettimeofday 实例?

    我想减去两个 gettimeofday 实例 并以毫秒为单位给出答案 这个想法是 static struct timeval tv gettimeofday tv NULL static struct timeval tv2 gettime
  • waitpid() 的作用是什么?

    有什么用waitpid 它通常用于等待特定进程完成 或者如果您使用特殊标志则更改状态 基于其进程 ID 也称为pid 它还可用于等待一组子进程中的任何一个 无论是来自特定进程组的子进程还是当前进程的任何子进程 See here http l
  • 如何从 LLVM 指令获取文件名和目录?

    我需要在 llvm 过程中提取目录和文件名 当前版本的 llvm 已移动getFilename and getDirectory from DebugLoc to DebugInfoMetadata 我找不到班级成员getFilename直
  • 在vscode中使用reactjs报错

    在 Visual Studio 代码中使用 jsx 语法 Visual Studio代码报错 请帮我 谢谢 符号 例如 而不是这样做 return lt button className square gt TODO lt button g
  • 如何在c linux中收听特定接口上的广播?

    我目前可以通过执行以下操作来收听我编写的简单广播服务器 仅广播 hello int fd socket PF INET SOCK DGRAM 0 struct sockaddr in addr memset addr 0 sizeof ad
  • 在 C++ linux 中将 STRINGS 写入串口

    我知道这个问题遍布互联网 但仍然没有任何东西能让我完全解决这个问题 我想用 C linux 将数据写入 Propeller 板的串行端口 从控制台获取输入时程序运行良好 但是当我向它写入字符串时总是返回 ERROR Invalid comm
  • 捕获实时流量时如何开启纳秒精度?

    如何告诉 libpcap v1 6 2 将纳秒值存储在struct pcap pkthdr ts tv usec 而不是微秒值 捕获实时数据包时 Note This question is similar to How to enable
  • Capistrano 3 部署无法连接到 GitHub - 权限被拒绝(公钥)

    我使用 Capistrano v3 和 capistrano symfony gem 设置了以下部署脚本 我正在使用 Ubuntu 14 4 部署到 AWS EC2 实例 我正在连接从 AWS 下载的 pem 文件 我的deploy rb中
  • 如何使用 Clang 查找内存泄漏

    我在我的机器 ubuntu 中安装了 Clang 以便发现我的 C 代码中的内存泄漏 我编写了一个示例代码来检查它的工作情况 如下所示 File hello c for leak detection include

随机推荐

  • 百度2014校园招聘笔试题武汉站三道算法设计题

    百度2014校园招聘笔试题武汉站三道算法设计题 1 给定任意一个整整数 求比这个数大且最小的不重复数 就是相邻两位不同 xff0c 例如1231 如1101就是重复数 解 xff1a 思路 xff1a 每次将给定的值加上1 xff0c 然后
  • spring data jpa 想使用EntityManager 对sql 进行处理四种方式(第四种本人改写的)

    下面看看主体的一个类 xff1a package com chinait service impl import java util List import javax persistence EntityManager import ja
  • Swagger2 (3) 集成easymock 生成mock 测试数据

    1 什么是 easy mock 2 可以集成swagger 3 我们来玩一下 首先你需要一个swagger 服务 xff1a 其次我们需要一个easy moke 网站账号 xff1a 接下来选择一个项目 点击编辑项目的配置 配置好项目信息
  • 用canvas做视频截图遇到的坑(已填坑)

    最近负责了一个后台功能的扩展 xff0c 因为没有前端 xff0c 所以客串了一把前端 xff0c 需求的内容是做一个视频截图的功能 xff0c 这期间遇到了canvas 的跨域问题 xff0c Uncaught DOMException
  • java 8 list.stream().collect Collectors.toMap 重复key 值处理

    问题描述 xff1a list 转 map 时 xff0c 首先看 两个phoneAuthUpdater 的key 都是 1 xff0c key 如果重复 xff0c 则会报这个错 可以选择第二种方法来解决 这种方式可以解决上面的问题 xf
  • mysql 时间格式转换,时区转化

    首先 xff0c 为了更好的展示 xff0c 我先把数据库里面存储的数据展示一下 xff0c 是如下图 xff1a 1 时间格式转换 时间 39 2019 01 22 15 45 06 39 转换成 unix 时间戳 select UNIX
  • 5.4 Stream Buffer

    Stream Buffer 是一种广义 Cache xff0c 主要功能是避免因为预读而造成的 Cache Pollution 问题 当采用该机制时 xff0c 处理器可以将预读的数据序列放入 Stream Buffer 中而不是放入 Ca
  • VxWorks的信号量机制分析

    VxWorks 的信号量机制分析 VxWorks 信号量是提供任务间通信 同步和互斥的最优选择 xff0c 提供任务间最快速的通信 也是提供任务间同步和互斥的主要手段 VxWorks 提供 3 种信号量来解决不同的问题 二进制信号量 xff
  • Linux系统内存、磁盘占用情况查询

    查看磁盘占用空间 df h 显示所有磁盘的使用情况 xff0c 包括磁盘的总大小 已用空间 可用空间和文件系统类型等 查看运行内存的占用情况 free m 查看进程 1 strong span style color fe2c24 ps s
  • 关于c语言的tcp通讯详细讲解

    目录 1 TCP概览 1 1 TCP基本特征 1 2 TCP通信流程基本原理 2 TCP编程的函数接口说明 3 TCP通讯测试代码 1 TCP概览 TCP全称 Transmition Control Protocol xff0c 即 xff
  • python watchdog:监控文件系统事件的Python库

    python watchdog xff1a 监控文件系统事件的Python库和shell工具 watchdog用来监控指定目录 文件的变化 xff0c 如添加删除文件或目录 修改文件内容 重命名文件或目录等 xff0c 每种变化都会产生一个
  • 关于c语言的udp通讯详细讲解

    目录 1 UDP简介 2 UDP通信流程 3 UDP的函数接口说明 4 UDP通讯测试代码 1 UDP简介 UDP全称 User Datagram Protocol xff0c 即 xff1a 用户数据报协议 是面向无连接的协议 通常 xf
  • python中关于Opencv中关于矩形的函数总结

    最近处理图像 xff0c 以前用的都是matlab xff0c 现在入手python比较慢 xff0c 这几天看到了很多命名和功能相似的函数 xff0c 作个记录总结一下 只是为了能够看下函数知道它是做什么的 xff0c 因此不会对其用法说
  • 在虚拟机中安装Ubuntu-Docker

    在虚拟机中安装Ubuntu Docker 第一步 安装虚拟机 1 安装虚拟机 xff0c 测试网络联网 图 1 安装ubuntu 图 2 设置系统时间 2 建立快照 建立快照 xff1a 快照001 安装成功 第二步 内核更新 可以通过do
  • Java中的toString()方法

    一 toString 方法介绍 toString 方法是 Object 类中的方法 xff0c toString 方法源代码如下 xff1a 1 getClass getName 返回类的全类名 包名 43 类名 2 Integer toH
  • 二十八. Semaphore的使用详解

    前言 Semaphore的官方注释如下 计数信号量 从概念上讲 xff0c 信号量维护一组许可证 xff08 permits xff09 通常 xff0c 每次调用Semaphore acquire方法时如果已经没有许可证 xff0c 则会
  • FreeRTOS vTaskDelay 卡死

    在Task中使用动态方法创建任务后 xff0c 在任务中调用vTaskDelay卡死 xff0c 然后排查问题 xff0c 定时器工作正常 xff0c 如果不使用vTaskDelay也可以一直运行 解决办法 xff0c 改成在main方法中
  • 图像为什么能相减

    前面提到 xff0c 我们可以把图像看作一个函数 xff0c 函数和函数之间是可以相加的 f x y 61 I 1 x y 43 I 2 x y 那么 xff0c 既然函数可以相加 xff0c 函数也是可以相减的 所以 xff0c 图像之间
  • 分析评估和定位声音质量

    64 author wangdaopo 64 email 3168270295 64 qq com 影响音频质量和稳定性的因素 音质好坏的评价 xff0c 响度 音高 音色 xff0c 测试 xff0c 你的语音引擎是基本可用的 xff0c
  • Linux下Clang-format代码格式化

    64 author wangdaopo 64 email 3168270295 64 qq com 1 Clang format 代码格式化介绍 平时团队进行合作的时候需要注意代码的格式 xff0c 虽然很难统一每个人的编码风格 xff0c