简介
编码不易,每家公司都有它的脾气。
c++的编码风格也有不少流派,这里独选google,一是因为它牛逼,向牛逼的学习总没错,二是它有很多开源项目使用的就是这个风格。
当你不知道怎么做才好时,就先用google的吧,已经有无数前仁验证过了。
本文不是要再罗列一遍所有的细则,而是提炼出编码中随时需要使用的部分,作出总结,这样方便参考。
具体结节,还请稳步开源文档:C++ 风格指南。
头文件
- 使用 #define 保护,为保证唯一性,头文件的命名使用项目目录的全路径
- 避免使用前置声明,使用 #include 包含所需的头文件
- 只有当函数小于10行,且没有循环,没有递归时才将其定义为内联函数,注意有些函数即使定义为内联,也不会被编译器内联(如虚函数、递归函数等)
- #include 文件的顺序:关联头文件、c库、c++库、第三方库、本项目中其他头文件。
作用域
- 鼓励在cpp文件中使用匿名命名空间或static声明,限定作用域为本文件
- 将局部变量的作用域限定在足够小的范围内,仅在使用时才声明
- 注意静态变量在不同的编译单元中构造顺序是不确定的,不要依赖它们的顺序
- 不要使用using导入整个命名空间,如
using namespace std;
类
- 不要在构造函数中调用虚函数,也不要在无法报出错误的情况下使用可能发生错误的初始化
- 不要定义隐式类型转换,必要时使用explicit关键字
- 如果类型需要,就明确定义拷贝、移动构造函数,否则禁用默认的相关构造函数,如:
MyClass(const MyClass&) = delete;
- 仅当只有数据成员时,使用struct,否则使用class
- 组合优先于继承,如果确实需要继承,使用public继承
- 声明顺序:应以 public: 开始, 后跟 protected:, 最后是 private:. 省略空部分.
函数
- 参数的顺序:先输入,后输出
- 输入参数一般使用const修饰的引用,输出参数一般使用指针
- 函数体不要过长,超过40行的函数,要考虑拆分成多个函数
- 不要滥用函数重载,除非一眼就能看清使用意图,否则考虑修改函数名称
其它特性
- 所有按引用传递的参数必须加上const
- 使用std::vector替换变长数组
- 允许合理地使用友元函数和友元类
- 不建议使用c++异常,对于throw出去的异常,必须保证有catch到它的地方,否则可能造成崩溃
- 类型转换不要再使用c语言模式的强制转换,使用如’static_cast’类型的转换
- 只在记录日志的地方使用流(如cout、fstream等),使用printf + read/write,它们线程安全,且避免了cout对<<重载的滥用
- 优先选用前置自增自减运算符
- 不要使用宏,使用内联函数、枚举、常量代替它
- 只要可读性好,提倡使用auto替换烦琐的类型名,但别用在局部变量之外的地方
- 适当使用Lambda表达式,但别用默认捕获,所有捕获都要显式写出来
- 尽量不要使用繁杂的模板编程
- 适当使用Boost库,提倡使用c++11新特性
命名约定
- 命名要有描述性,少用缩写,长也没有关系,关键是要见名知意
- 文件名全部小写,单词之间使用下划线隔开
- 类型名首字母大写,不使用下划线
- 变量和数据成员名一律小写,单词之间使用下划线连接
- 类的成员变量以下划线结尾
- 结构体成员变量不使用下划线结尾
- 常量命名以’k’开头,后接首字母大小的单词
- 函数命名使用首字母大写的单词
- 命名空间使用小写字母命名,具体名称取决于项目名称,注意避免冲突
- 枚举中成员的命名和常量一致
- 宏命名:全大写字母加下划线(希望你用不善这条)
注释
- 尽量把代码写的不需要注释也能看懂,如果做不到,就加上必要的注释
- 注释风格统一就行
格式
-
每行代码不要超过80,注意换行
-
源文件编码格式统一为utf-8
-
建议使用空格缩进,可以在编辑器里把tab设置为空格
-
函数声明与定义:
- 使用好的参数名.
- 只有在参数未被使用或者其用途非常明显时, 才能省略参数名.
- 如果返回类型和函数名在一行放不下, 分行.
- 如果返回类型与函数声明或定义分行了, 不要缩进.
- 左圆括号总是和函数名在同一行.
- 函数名和左圆括号间永远没有空格.
- 圆括号与参数间没有空格.
- 左大括号总在最后一个参数同一行的末尾处, 不另起新行.
- 右大括号总是单独位于函数最后一行, 或者与左大括号同一行.
- 右圆括号和左大括号间总是有一个空格.
- 所有形参应尽可能对齐.
- 缺省缩进为 2 个空格.
- 换行后的参数保持 4 个空格的缩进.
-
使用必要的空格来使表达式更可读
-
使用必要的空行分隔逻辑,不可一次使得多个空行
规则特例
- 新的编码风格不影响旧代码
- windows代码的风格
小节
编码风格是一种规范,便于开发人员之间使用代码交流。才有人愿意review你的代码。
就像交通规则,看到绿灯就可以通行一样,有了google规范,看到 kTimeOut 就知道这是个常量。
使用经过验证的规范,还有利于避免一些缺陷和陷阱,减少debug时间。
更多详细内容,请参考 C++ 风格指南。