Google C++ 开发代码规范
[TOC]
命名约定
不要缩写,除非很常见的写法
文件名
文件名要全部小写,可以包含下划线 (_)
my_useful_class.ccmyusefulclass.cc
C++以.cc结尾,头文件以.h结尾
内联函数定义必须在.h内,若代码很短,则可直接在.h中实现
类型
类、结构体、typedef、using、枚举
首字母和每个单词首字母大写,不包含下划线
MyExcitingClass
变量
包括函数参数,全部小写,单词间使用下划线 (_)
类的成员变量以下划线结尾(结构体不用)
1 | string table_name; // 好 - 用下划线. |
常量
包括静态变量、全局变量等值不发生变化的值
以k开头,单词首字母大写
const int kDaysInAWeek = 7;
函数
每个单词首字母大写 AddTableEntry()
(缩写的情况:例如, 写作 StartRpc() 而非 StartRPC()).
宏
MY_MACRO_THAT_SCARES_SMALL_CHILDREN
但是别用
头文件
define 保护
以foo/src/bar/baz.h为例:
1 |
|
即:项目名 SRC下的路径 文件名
inline
不要内联超过10行的代码
以及析构函数、递归函数、虚函数
include
首先你需要避免使用.和..
若路径为google-awesome-project/src/base/logging.h
则格式如下:
1 |
假设此时有一.cc(谷歌的cpp喜欢用.cc作为文件后缀)
实现一个dir/foo.cc,其函数原型在dir2/foo.h中
此时头文件顺序为:
dir2/foo.h(可保证优先报错)- C头文件
- C++头文件
- 其他库的
.h文件 - 本项目的
.h文件
按字母顺序分别对每种类型的头文件进行二次排序是不错的主意。
类
等我学到面向对象再说
函数
参数
- 按引用传递必须加上const
- 若需要修改值,使用指针
作用域
命名空间(未记录)
还没怎么用,以后补
局部变量
最小化局部变量的作用域,并且尽量靠近第一次的使用地点
避免以下操作:
1 | int i; |
1 | vector<int> v; |
但是需要注意,如果引起效率变低(构造函数多次使用)
请放大作用域
1 | // 低效的实现 |
其他
- 使用 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
- 只有数据成员:结构体。其他情况使用类