《Google C++ 编码规范》小结
前言:
现在写代码,很多时候都是借鉴的别人的代码。而大家的代码风格都不同,很多时候我也会造成自己没有固定的代码风格。从网上找了这个《Google C++ 编码规范》,希望整理出自己的编码风格。
·头文件
1.#define的保护:使用#ifndef <PROJECT>_<PATH>_<FILE>_H_,#define和#endif。
2.头文件依赖:为了减少引入更多头文件,可多使用前置声明和使用指针成员。
3.内联函数:10行内,不要包含循环和switch语句和虚函数及递归函数。
需小心析构函数--因为包含数据成员的释放。
4.-inl.h文件:非必需的,用于是头文件更干净而将内联实现放在-inl.h文件中。
5.函数参数顺序:输入参数在前,输出参数在后。
6.包含文件的名称及次序:[同名.h]、C库、C++库、其他库的.h和项目内的.h。
同时在#include项目内.h问件时最好使用完整路径而避免使用.和..表示。
·作用域
1.命名空间:提倡使用具名命名空间和在.cc文件中使用匿名命名空间来减少名字冲突。
2.嵌套类:最好将嵌套类定义为public,除非是接口的一部分。
3.非成员函数、静态成员函数和全局函数:尽量避免使用全局函数。
4.局部变量:尽可能声明在最小作用域内,并在声明时就初始化。
还需要注意一点是避免在循环中定义变量。
5.全局变量:class类型的全局变量应被禁止的,内建类型则允许。因为构造函数的调用无序性。
class类型全局变量的回避可以采用单例模式。全局字符串也采用C风格字符串。
静态成员变量也被视作全局变量,也应避免class类型。
·类
1.构造函数的职责:只进行无实际意义的初始化,有意义的初始化放在函数init()中。
可在需要是增加成员标记对象是否已经初始化。
2.默认构造函数:虽然编译器可提供默认构造函数,还需要自定定义一个。
3.明确的构造函数:对单参数构造函数使用explicit。
4.拷贝构造函数:STL容器要求所有内容可拷贝、可赋值--替代方法是使用指针容器。
当不需要拷贝构造函数时使用
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&); \
void operator=(const TypeName&)
当拷贝时需要检测自赋值情况。
5.结构体和类:仅当只有数据时使用struct,其它一概使用class。
6.继承:使用组合通常比使用继承更适宜,如使用继承的话,只使用公共继承。
继承主要用于两个场合:实现继承和接口继承。
7.多重继承:真正需要用到多重实现继承的时候非常少。
8.接口:指满足特定条件的类,以Interface为后缀。
9.操作符重载:除少数特定环境外,不要重载操作符--提供相应的函数替代。
10.存取控制:一般为内联函数。数据成员obj_,取值和赋值函数名:obj(),set_obj()。
11.声明次序:public:在private:前,成员函数在数据成员前。
(typedefs和enums)>常量>构造析构函数>成员函数>数据成员>DISALLOW宏
12.编写短小函数:倾向于选择短小、凝练的函数。
·google特有的风情
1.智能指针:多使用智能指针--现在倾向于使用boost的智能指针。
·其他C++特性
1.引用参数:引用参数前必须加上const。
2.函数重载:仅在输入参数类型不同、功能相同时使用重载函数。
3.缺省参数:禁止使用缺省函数参数。
4.变长数组和alloca:存在内存泄漏的风险,不推荐使用。
5.友元:允许合理使用友元类及友元函数。
6.异常:不要使用C++异常。替代是使用错误代码和断言等。
7.运行时类型识别:禁止使用RTTI。
8.类型转换:使用C++风格类型转换函数,而避免使用C风格类型转换。
9.流:只在记录日志时使用流。替代使用printf()和scanf()。
10.前置自增和自减:可能的话尽量使用++i形式。
11.const的使用:推荐常使用。
12.整型:常用的是int,如需不同大小可使用<stdint.h>中定义的整型值(int16_t等)
如无必要,不推荐使用无符号整型。
13.64位下的可移植性:
14.预处理宏:使用宏时要谨慎,尽量以内联函数、枚举和常量代替。
15.0和NULL:整数用0,实数用0.0,指针用NULL,字符串用'\0'。
16.sizeof:尽可能用sizeof(varname)代替sizeof(type)。
17.Boost库:只使用Boost库中被认可的库。
·命名约定
1.通用命名规则:不要节约空间,名称应该更具有描述性。
2.文件命名:全部小写,可含有下划线或短线。文件名也多以内部类命名。
3.类型命名:每个单词首字母大写且不含下划线。类型有:类、结构体、typedef定义和枚举。
4.变量命名:一律小写,单词间以下划线相连,类成员变量以下划线结尾。
结构体成员变量跟普通变量一样;而全局变量应少用,使用时可加前缀g_区分。
5.常量命名:在名称前加k前缀,如kDaysInAWeek。
6.函数命名:普通函数如void AddTableEntry()形式。
存取函数,如int num_entries_的存取函数num_entries()和set_num_entries。
7.命名空间:全小写,如google_awesome_project。
8.枚举命名:枚举值应全部大写,单词以下划线相连。
9.宏命名:形式如MY_MACRO_LIKE_THIS.
10.命名规则例外:参考现有或相近命名约定。
·注释:
1.注释风格:使用//和/**/,统一就好
2.文件注释:通常.h文件主要要说明功能和用法,而.cc文件则包含更多的实现细节和算法讨论。
3.类注释:
4.函数注释:
5.变量注释:
6.实现注释:
7.标点、拼写和语法:
8.TODO注释:对临时的、短期的解决方案或已够好但并不完美的代码使用TODO注释。
·格式
1.行长度:不超过80.
2.非ASCII字符:避免使用非ASCII字符,使用时要使用UTF-8格式。
3.空格还是制表符:只使用空格,可设IDE将tab转为空格。
4.函数声明和定义:
5.函数调用:
6.条件语句:
7.循环和开关选择语句:
8.指针和引用表达式:
9.布尔表达式:
10.函数返回值:return表达式中不要使用圆括号。
11.变量及数组初始化:
12.预处理指令:
13.类格式:
14.初始化列表:
15.命名空间格式化:
16.水平留白:
17.垂直留白:
·规则之例外
略
·团队合作
略