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)xint y = int(x) 等转换方式
  • 不用流
  • 使用前缀形式 (++i)
  • 没必要使用无符号整数,不如通过断言指出非负数
  • int16_t, uint32_t, int64_t 等整型, 在需要确保整型大小时可以使用它们代替 short, unsigned long long
    • 只使用 int.
    • 在合适的情况下, 推荐使用标准类型如 size_tptrdiff_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. 其他