Google C++ 命名风格

 
 2.2k
 

节选自 Google C++ Style Guide 的命名约定,有时总会忘记一些命名规则,在这里记录一下方便查询

2024-08-29 10:57:00

目录:

6 命名约定

6.1 通用命名规则

6.2 文件命名

6.3 类型命名

6.4 变量命名

6.5 常量命名

6.6 函数命名

6.7 命名空间命名

6.8 枚举命名

6.9 宏命名

6.10 命名规则的特例

7 注释


6 命名约定

6.1 通用命名规则

Tip:函数命名、变量命名、文件命名要有描述性,少用缩写

对于一些常见的变量缩写名,可以是适当采用,你知道我的意思吧,例如cntnum等,但是对于n这种变量名最好还是不要采用了

6.2 文件命名

Tip:文件名要全部小写,可以包含下划线(_)或连字符(-)。如果没有项目约定,下划线更好

6.3 类型命名

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

所有类型命名——类,结构体,类型定义(typedef),枚举——均使用相同约定

6.4 变量命名

Tip:变量名一律小写,单词之间用下划线连接,类的成员变量以下划线结尾,但结构体不用,如:a_class_data_member_,a_struct_data_member

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

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

全局变量:对全局变量没有特别要求,少用就好,如果你要,可以用 g_ 或其他标志作为前缀,以便更好的区分局部变量

6.5 常量命名

Tip:在全局或类里的常量名称前加 k:kDaysInAWeek,切出去开头的 k 之外每个单词开头字母均大写。所有编译时常量,无论是局部的,全局的还是类中的,和其他变量稍微区别一下,k 后接字母大写的单词

这规则适用于编译时的局部作用域常量,不过按变量规则来命名也可以

6.6 函数命名

Tip:常规函数使用大小写混合,取值和设置函数则要求与变量名匹配

常规函数:函数名的每个单词首字母大写,没有下划线

取值和设置函数:取值(Accessors)和设置(Mutators)函数要与存取的变量名匹配

1
2
3
4
5
6
7
8
class MyClass {
public:
...
int num_entries() const { return num_entries_; }
void set_num_entries(int num_entries) const { num_entires_ = num_entries; }
private:
int num_entires_;
};

6.7 命名空间命名

Tip:命名空间用小写字母命名,并基于项目名称和目录名称:google_awesome_project

6.8 枚举命名

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

新代码的枚举值应该优先采用常量的命名方式,因为枚举值和宏之间的命名冲突,会直接导致很多问题

6.9 宏命名

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

6.10 命名规则的特例

Tip:如果你命名的实体与已有 C/C++ 实体相似,可参考现有命名策略

  • bigopen():

    ​ 函数名, 参照 open() 的形式

  • uint:

    ​ typedef

  • bigpos:

    ​ struct 或 class, 参照 pos 的形式

  • sparse_hash_map:

    ​ STL 相似实体; 参照 STL 命名约定

  • LONGLONG_MAX:

    ​ 常量, 如同 INT_MAX

7 注释

关于注释风格,很多 C++ 的 coders 更喜欢行注释,C coders 或许对块注释依然情有独钟,或者在文件头大段大段的注释时使用块注释

7.1 实现注释

代码前注释:

​ 巧妙或复杂的代码段前要加注释

1
2
3
4
5
6
7
// Divide result by two, taking into account that x
// contains the carry from the add.
for (int i = 0; i < result->size(); i++) {
x = (x << 8) + (*result)[i];
(*result)[i] = x >> 1;
x &= 1;
}

行注释:

​ 比较隐晦的地方要在行尾加入注释,在行尾空两个进行注释

1
2
3
4
// If we have enough memory, mmap the data portion too.
mmap_budget = max<int64>(0, mmap_budget - index_->length());
if (mmap_budget >= data_size_ && !MmapData(mmap_chunk_bytes, mlock))
return; // Error already logged.

不允许:

​ 注意永远不要用自然语言翻译代码作为注释,要假设读代码的人 C++ 水平比你高,即便那个人可能不知道你的用意

1
2
3
// 现在, 检查 b 数组并确保 i 是否存在,
// 下一个元素是 i+1.
... // 天哪. 令人崩溃的注释.

7.2 TODO 注释

Tip:对那些临时的、短期的解决方案,或已经够好但仍不完美的代码使用 TODO 注释

1
// TODO(个人信息): Remove this code when all clients can handle XML responses
Comments