《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.垂直留白:

·规则之例外

·团队合作