AoiJays's Space.

Google C++ 开发代码规范 · 笔记

2023/12/22

Google C++ 开发代码规范

[TOC]

命名约定

不要缩写,除非很常见的写法

文件名

文件名要全部小写,可以包含下划线 (_)

  • my_useful_class.cc
  • myusefulclass.cc

C++以.cc结尾,头文件以.h结尾

内联函数定义必须在.h内,若代码很短,则可直接在.h中实现

类型

类、结构体、typedef、using、枚举

首字母和每个单词首字母大写,不包含下划线

MyExcitingClass

变量

包括函数参数,全部小写,单词间使用下划线 (_)

类的成员变量以下划线结尾(结构体不用)

1
2
3
4
5
6
7
8
9
10
string table_name;  // 好 - 用下划线.

class TableInfo {
...
private:
string table_name_; // 好 - 后加下划线.
string tablename_; // 好.
static Pool<TableInfo>* pool_; // 好.
};

常量

包括静态变量、全局变量等值不发生变化的值

以k开头,单词首字母大写

const int kDaysInAWeek = 7;

函数

每个单词首字母大写 AddTableEntry()

(缩写的情况:例如, 写作 StartRpc() 而非 StartRPC()).

宏

MY_MACRO_THAT_SCARES_SMALL_CHILDREN

但是别用

头文件

define 保护

以foo/src/bar/baz.h为例:

1
2
3
4
#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
...
#endif // FOO_BAR_BAZ_H_

即:项目名 SRC下的路径 文件名

inline

不要内联超过10行的代码

以及析构函数、递归函数、虚函数

include

首先你需要避免使用.和..

若路径为google-awesome-project/src/base/logging.h

则格式如下:

1
#include "base/logging.h"

假设此时有一.cc(谷歌的cpp喜欢用.cc作为文件后缀)

实现一个dir/foo.cc,其函数原型在dir2/foo.h中

此时头文件顺序为:

  • dir2/foo.h(可保证优先报错)
  • C头文件
  • C++头文件
  • 其他库的.h文件
  • 本项目的.h文件

按字母顺序分别对每种类型的头文件进行二次排序是不错的主意。

类

等我学到面向对象再说

函数

参数

  • 按引用传递必须加上const
  • 若需要修改值,使用指针

作用域

命名空间(未记录)

还没怎么用,以后补

局部变量

最小化局部变量的作用域,并且尽量靠近第一次的使用地点

避免以下操作:

1
2
3
4
int i;
i = f(); // 坏——初始化和声明分离

int j = g(); // 好——初始化时声明
1
2
3
4
5
vector<int> v;
v.push_back(1); // 用花括号初始化更好
v.push_back(2);

vector<int> v = {1, 2}; // 好——v 一开始就初始化

但是需要注意,如果引起效率变低(构造函数多次使用)

请放大作用域

1
2
3
4
5
6
7
8
9
10
// 低效的实现
for (int i = 0; i < 1000000; ++i) {
Foo f; // 构造函数和析构函数分别调用 1000000 次!
f.DoSomething(i);
}

Foo f; // 构造函数和析构函数只调用 1 次
for (int i = 0; i < 1000000; ++i) {
f.DoSomething(i);
}

其他

  • 使用 C++ 的类型转换, 如 static_cast<>(). 不要使用 int y = (int)x 或 int y = int(x) 等转换方式
  • 不用流
  • 使用前缀形式 (++i)
  • 没必要使用无符号整数,不如通过断言指出非负数
  • int16_t, uint32_t, int64_t 等整型, 在需要确保整型大小时可以使用它们代替 short, unsigned long long 等
    • 只使用 int.
    • 在合适的情况下, 推荐使用标准类型如 size_t 和 ptrdiff_t
  • 对于大整数, 使用 int64_t
  • 除了防包含,尽量不用宏
    • 如果使用,使用完成后立马#undef
  • 0
    • 整数0
    • 实数0.0
    • 指针nullptr或者NULL
    • 字符串、字符\0
  • 只有数据成员:结构体。其他情况使用类
CATALOG
  1. 1. Google C++ 开发代码规范
    1. 1.1. 命名约定
      1. 1.1.1. 文件名
      2. 1.1.2. 类型
      3. 1.1.3. 变量
      4. 1.1.4. 常量
      5. 1.1.5. 函数
      6. 1.1.6. 宏
    2. 1.2. 头文件
      1. 1.2.1. define 保护
      2. 1.2.2. inline
      3. 1.2.3. include
    3. 1.3. 类
    4. 1.4. 函数
      1. 1.4.1. 参数
    5. 1.5. 作用域
      1. 1.5.1. 命名空间(未记录)
      2. 1.5.2. 局部变量
    6. 1.6. 其他