前言
前文简单提到clang-tidy提供命名规范检查,由于篇幅,没有详细讲解。
正好最近又分了个打杂的活——旧项目代码规范整改。
就顺便写个博客,补充描述下在vscode中如何使用clang-tidy进行静态检查。
clang-tidy
clang-tidy我是直接用clangd内部集成的,主要是错误可以方便的直接显示在vscode错误,且可以直接quick fix,不用自己劳心劳力手动替换,手动还容易替换错。
命名规范要求
先说说我这边的要求吧,,给我的感觉就是大杂烩,大概就是google命名规范+华为命名规范的样子。
不过命名规范这种东西见仁见智,反正我不是某一派的死忠,除了匈牙利命名法都可以接受,既然公司已经定好规范,遵守就好。
公司文档看下来,大概要求如下:
- 结构体及自由函数:小写+下划线,lower_case
- 成员变量:m前缀+大驼峰,m+CamelCase
- 类名:大坨峰,CamelCase
- 宏定义及枚举:UPPER_CASE
- 类方法:小驼峰,camelBack
- 全局变量:g前缀+大驼峰,g+CamelCase
- 常量:k前缀+大驼峰,k+CamelCase
- 局部变量:小驼峰,camelBack
配置规则熟悉
clang-tidy 关于命名规范的check 都在readability-identifier-naming这个check集里面。
要求有了,参考check也有了,那就一个一个对应填空呗
clang可识别支持的有以下几种命名法,常见的都支持
- lower_case,
- UPPER_CASE,
- camelBack,
- CamelCase,
- camel_Snake_Back,
- Camel_Snake_Case,
- aNy_CasE.
另外可以支持前缀后缀,细分的模块也特别多,私有、公有、保护成员,全局,静态,等等等等,只要不是特别离谱的需求,基本都能自定义配出来,我上面的要求也就是洒洒水。
至于我得需求和checks的对应整理如下
- 结构体:StructCase
- 自由函数: FunctionCase
- 类方法:MethodCase,特别注意不是ClassMethodCase,这个值得是类静态成员函数,官方文档示例是错误的!
- 成员变量: MemberCase ,注意区别ClassMemberCase,同上
- 类名:ClassCase
- 宏定义:MacroDefinitionCase
- 枚举:EnumCase 、EnumConstantCase
- 全局变量:GlobalVariableCase
- 常量:ConstantCase
- 局部变量:VariableCase
前缀后缀就是把case换成Prefix、Suffix,不赘述
配置文件导入
至于如何配置clang-tidy的check,有两种方法
- clang-tidy文件:clangd里面的clang-tidy,你可以跟clang-format一样在根目录下添加.clang-tidy 文件,静态检查会自行加载该文件的规则,但是写了一下,感觉语法比较不爽,如下:
Checks: 'readability-identifier*'
WarningsAsErrors: ''
HeaderFilterRegex: ''
AnalyzeTemporaryDtors: false
FormatStyle: none
User: van helsing
CheckOptions:
- key: readability-identifier-naming.VariableCase
value: camelBack
- key: readability-identifier-naming.MacroDefinitionCase
value: UPPER_CASE
- 另一种clangd的配置文件.clangd了,同样扔根目录,写法要简单一点点,不用特别 key: <key>, value: <value>,写着头疼,直接 <key>: <value>,如下
Diagnostics:
ClangTidy:
Add:
[
readability-identifier*,
]
CheckOptions:
readability-identifier-naming.VariableCase: camelBack
附
自用clangd命名检查配置文件
Diagnostics:
ClangTidy:
Add:
[
readability-identifier*,
]
CheckOptions:
readability-identifier-naming.VariableCase: camelBack
readability-identifier-naming.GlobalVariableCase: CamelCase
readability-identifier-naming.GlobalVariablePrefix: g
readability-identifier-naming.MemberPrefix: m
readability-identifier-naming.MemberCase: CamelCase
readability-identifier-naming.ClassMemberPrefix: m
readability-identifier-naming.ClassMemberCase: CamelCase
readability-identifier-naming.EnumCase: UPPER_CASE
readability-identifier-naming.EnumConstantCase: UPPER_CASE
readability-identifier-naming.MacroDefinitionCase: UPPER_CASE
readability-identifier-naming.ClassCase: CamelCase
readability-identifier-naming.StructCase: lower_case
readability-identifier-naming.FunctionCase: lower_case
readability-identifier-naming.ClassMethodCase: camelBack
readability-identifier-naming.MethodCase: camelBack
readability-identifier-naming.ConstantCase: CamelCase
readability-identifier-naming.ConstantPrefix: k