查看原文
其他

Google 开源项目风格:C/C++命名规范

strongerHuang strongerHuang 2021-02-01
关注、星标公众,不错过精彩内容

整理:黄工

素材来源:网络

参考来源:
https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/naming/


前不久分享过的一篇文章《如何写出让同事无法维护的代码?》是一篇反面教材,很多人也看出来了,但避免不了杠精。

一个好的代码规范直接影响代码的质量,今天给大家分享的内容如标题所示:C/C++命名规范

命名约定
最重要的一致性规则是命名管理, 命名的风格能让我们在不需要去查找类型声明的条件下快速地了解某个名字代表的含义: 类型、变量、 函数、 常量、宏等。甚至,我们大脑中的模式匹配引擎非常依赖这些命名规则。

命名规则具有一定随意性, 但相比按个人喜好命名, 一致性更重要, 所以无论你认为它们是否重要, 规则总归是规则。

一、通用命名规则

1.总述

函数命名, 变量命名, 文件命名要有描述性; 少用缩写。


2.说明

尽可能使用描述性的命名, 别心疼空间, 毕竟相比之下让代码易于新读者理解更重要. 不要用只有项目开发者能理解的缩写, 也不要通过砍掉几个字母来缩写单词。


比如:


注意, 一些特定的广为人知的缩写是允许的, 例如用 i 表示迭代变量和用 T 表示模板参数。


模板参数的命名应当遵循对应的分类: 类型模板参数应当遵循类型命名的规则, 而非类型模板应当遵循变量命名的规则。


二、文件命名

1.总述

文件名尽量全部小写, 可以包含下划线 (_) 或连字符 (-), 依照项目的约定. 如果没有约定, 那么 “_” 更好。


2.说明

通常应尽量让文件名更加明确,bsp_i2c.h 就比 i2c.h 要好。


同时,源文件和头文件最好成对出现,比如 bsp_i2c.c 和 bsp_i2c.h 。


定义的方式有很多中,比如通过下划线或连字符:

  • bsp_i2c.c

  • bsp-i2c.c

  • bspi2c.c


四、类型命名

1.总述

类型名称的每个单词首字母均大写, 不包含下划线: MyExcitingClass, MyExcitingEnum.


2.说明

所有类型命名 —— 类, 结构体, 类型定义 (typedef), 枚举, 类型模板参数 —— 均使用相同约定, 即以大写字母开始, 每个单词首字母均大写, 不包含下划线。


例如:


五、变量命名

1.总述

变量 (包括函数参数) 和数据成员名一律小写, 单词之间用下划线连接. 类的成员变量以下划线结尾, 但结构体的就不用, 如: a_local_variable, a_struct_data_member, a_class_data_member_.


2.说明

普通变量命名

举例:


类数据成员

不管是静态的还是非静态的, 类数据成员都可以和普通变量一样, 但要接下划线。


结构体变量

不管是静态的还是非静态的, 结构体数据成员都可以和普通变量一样, 不用像类那样接下划线:


六、常量命名

1.总述
声明为 constexpr 或 const 的变量, 或在程序运行期间其值始终保持不变的, 命名时以 “k” 开头, 大小写混合。
例如:
const int kDaysInAWeek = 7;

2.说明
所有具有静态存储类型的变量 (例如静态变量或全局变量, 参见 存储类型) 都应当以此方式命名. 对于其他存储类型的变量, 如自动变量等, 这条规则是可选的. 如果不采用这条规则, 就按照一般的变量命名规则。

七、函数命名

1.总述

常规函数使用大小写混合, 取值和设值函数则要求与变量名匹配: MyExcitingFunction(), MyExcitingMethod(), my_exciting_member_variable(), set_my_exciting_member_variable()。


2.说明

一般来说, 函数名的每个单词首字母大写 (即 “驼峰变量名” 或 “帕斯卡变量名”), 没有下划线. 对于首字母缩写的单词, 更倾向于将它们视作一个单词进行首字母大写 (例如, 写作 StartRpc() 而非 StartRPC())。

(同样的命名规则同时适用于类作用域与命名空间作用域的常量, 因为它们是作为 API 的一部分暴露对外的, 因此应当让它们看起来像是一个函数, 因为在这时, 它们实际上是一个对象而非函数的这一事实对外不过是一个无关紧要的实现细节)


取值和设值函数的命名与变量一致. 一般来说它们的名称与实际的成员变量对应, 但并不强制要求. 例如 int count() 与 void set_count(int count)。


八、枚举命名

1.总述

枚举的命名应当和 常量 或 宏 一致: kEnumName 或是 ENUM_NAME.


2.说明

单独的枚举值应该优先采用 常量 的命名方式. 但 宏 方式的命名也可以接受. 枚举名 UrlTableErrors (以及 AlternateUrlTableErrors) 是类型, 所以要用大小写混合的方式。


九、命名

1.总述

你并不打算 使用宏, 对吧? 如果你一定要用, 像这样命名: MY_MACRO_THAT_SCARES_SMALL_CHILDREN.


2.说明

参考 预处理宏; 通常 不应该 使用宏. 如果不得不用, 其命名像枚举命名一样全部大写, 使用下划线:

#define ROUND(x) ...

#define PI_ROUNDED 3.0


十、代码命名“神奇”

最后,推荐一个代码命名“神奇”,可能很多人都知道了,就是Codeif。


网址:

https://codeif.xinke.org.cn


输入你想要查询的名称,比如传感器:


‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧
推荐阅读:
精选汇总 | 目录 | 搜索
为什么Linux比windows更适合嵌入式系统
提问技巧 | 开发者如何有条理的提问

关注微信公众号『strongerHuang』,后台回复“1024”,查看更多精彩内容。


长按识别图中二维码关注

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存