Google C++
编程规范
目½
一、头文件
.........................................................................................................................................
4
1. #define
的保护
.......................................................................................................................
4
2.
头文件依赖
..........................................................................................................................
4
3.
内联½数
..............................................................................................................................
5
4. -inl.h
文件
..........................................................................................................................
5
Function
5.
½数参数顺序(Function
Parameter Ordering
............................................
5
Ordering)
6.
包含文件的名称及次序
......................................................................................................
6
二、½用域
.........................................................................................................................................
7
Namespaces
1.
½名空间(Namespaces
..........................................................................................
7
Namespaces)
Nested Class)
2.
嵌套类(Nested
Class
.............................................................................................
9
Nonmember
Static Member)和全局½
3.
非成员½数(Nonmember
Nonmember)、静态成员½数(Static Member
Global Functions)
数(Global
Functions
...................................................................................................
9
Local Variables)
4.
局部变量(Local
Variables
..................................................................................
10
Global Variables)
5.
全局变量(Global
Variables
...............................................................................
10
三、类
...............................................................................................................................................
11
Constructor
1.
构造½数(Constructor
Constructor)的职责
..............................................................................
11
Default Constructors)
2.
默认构造½数(Default
Constructors
.............................................................
12
Explicit Constructors)
3.
明确的构造½数(Explicit
Constructors
.........................................................
12
4.
拷贝构造½数(Copy
Constructors
...................................................................
13
Copy Constructors)
Structs
5.
结构½和类(Structs
vs. Classes
......................................................................
14
Classes)
Inheritance
6.
继承(Inheritance
..................................................................................................
14
Inheritance)
Multiple Inheritance)
7.
多重继承(Multiple
Inheritance
......................................................................
15
Interface
8.
接口(Interface
.......................................................................................................
15
Interface)
9.
操½符重½½(Operator
Overloading
...............................................................
16
Operator Overloading)
Access Control)
10.
存取控制(Access
Control
................................................................................
16
Declaration Order)
11.
声明次序(Declaration
Order
.........................................................................
17
Write
12.
编写短小½数(Write
Short Functions
........................................................
17
Functions)
Google
四、Google 特有的风情
.................................................................................................................
18
Smart Pointers)
1.
智½指针(Smart
Pointers
..................................................................................
18
五、其他
C++
C++特性.
.........................................................................................................................
19
1.
引用参数(Reference
Arguments
...................................................................
19
Reference Arguments)
Function Overloading)
2.
½数重½½(Function
Overloading
....................................................................
19
Default Arguments)
3.
缺省参数(Default
Arguments
.........................................................................
20
4.
变长数组和
alloca Variable-Length Arrays and alloca()
................
20
alloca(Variable-Length
alloca())
Friends
5.
友元(Friends
............................................................................................................
20
Friends)
6.
异常(Exceptions
....................................................................................................
20
Exceptions
Exceptions)
Run-Time
7.
运行时类型识别(Run-Time
Type Information, RTTI
...........................
22
RTTI)
Casting
8.
类型½换(Casting
...................................................................................................
22
Casting)
Streams
9.
流(Streams
..............................................................................................................
23
Streams)
Preincrement
10.
前½自增和自减(Preincrement
and Predecrement
............................
24
Predecrement)
Use
11. const
的½用(Use
of const
.............................................................................
24
const)
Integer Types)
12.
整型(Integer
Types
..........................................................................................
25
64-bit Portability)
13. 64
½下的可移植性(64-bit
Portability
........................................................
26
14.
预处理宏(Preprocessor
Macros
..................................................................
27
Preprocessor Macros)
15. 0
和
NULL 0 and NULL
....................................................................................
27
NULL(0
NULL)
16. sizeof sizeof
........................................................................................................
28
sizeof(sizeof
sizeof)
Boost
17. Boost
库(Boost
...................................................................................................
28
Boost)
六、½名约定
...................................................................................................................................
29
General
1.
通用½名规则(General
Naming Rules
..........................................................
29
Rules)
File Names)
2.
文件½名(File
Names
...........................................................................................
30
3.
类型½名(Type
Names
.........................................................................................
31
Type Names)
Variable Names)
4.
变量½名(Variable
Names
.................................................................................
31
Constant Names)
5.
常量½名(Constant
Names
...............................................................................
31
Function Names)
6.
½数½名(Function
Names
................................................................................
32
Namespace Names)
7.
½名空间(Namespace
Names
.........................................................................
32
8.
枚举½名(Enumerator
Names
.........................................................................
32
Enumerator Names)
Macro Names)
9.
宏½名(Macro
Names
..........................................................................................
33
Exceptions
10.
½名规则例外(Exceptions
to Naming Rules
..........................................
33
Rules)
七、注释
...........................................................................................................................................
34
Comment Style)
1.
注释风格(Comment
Style
..................................................................................
34
File Comments)
2.
文件注释(File
Comments
...................................................................................
34
Class Comments)
3.
类注释(Class
Comments
...................................................................................
34
4.
½数注释(Function
Comments
.......................................................................
35
Function Comments)
Variable Comments)
5.
变量注释(Variable
Comments
........................................................................
36
Implementation Comments)
6.
实现注释(Implementation
Comments
......................................................
37
Punctuation,
7.
标点、拼写和语法(Punctuation,
Spelling and Grammar
...................
38
Grammar)
TODO Comments)
8. TODO
注释(TODO
Comments
.........................................................................
38
八、格式
...........................................................................................................................................
39
Line Length)
1.
行长度(Line
Length
..............................................................................................
39
Non-ASCII Characters)
2.
非 ASCII 字符(Non-ASCII
Characters
..........................................................
40
Spaces
3.
空格还是制表½(Spaces
vs. Tabs
....................................................................
40
Tabs)
Function
4.
½数声明与定义(Function
Declarations and Definitions
...................
40
Definitions)
Function Calls)
5.
½数调用(Function
Calls
....................................................................................
42
Conditionals
6.
条件语句(Conditionals
........................................................................................
43
Conditionals)
7.
循环和开关选择语句(Loops
and Switch Statements
.............................
44
Loops
Statements)
Pointers
8.
指针和引用表达式(Pointers
and Reference Expressions
...................
45
Expressions)
Boolean Expressions)
9.
布尔表达式(Boolean
Expressions
.................................................................
46
Return Values)
10.
½数返回值(Return
Values
.............................................................................
46
Variable
11.
变量及数组初始化(Variable
and Array Initialization
........................
46
Initialization)
12.
预处理指令(Preprocessor
Directives
.......................................................
46
Preprocessor Directives)
Class Format)
13.
类格式(Class
Format
........................................................................................
47
Initializer Lists)
14.
初始化列表(Initializer
Lists
...........................................................................
48
Namespace Formatting)
15.
½名空间格式化(Namespace
Formatting
.................................................
48
Horizontal Whitespace)
16.
水平留½(Horizontal
Whitespace
..............................................................
49
Vertical Whitespace)
17.
垂直留½(Vertical
Whitespace
....................................................................
50
九、规则之例外
...............................................................................................................................
52
Existing
1.
现有不统一代码(Existing
Non-conformant Code
...................................
52
Code)
2. Windows
代码(Windows
Code
......................................................................
52
Windows Code)
十、团队合½
...................................................................................................................................
53
一、头文件
通常,每一个.cc 文件(C++的源文件)½有一个对应的.h 文件(头文件),也有一些例
外,如单元测试代码和只包含
main()的.cc
文件。
正确½用头文件可令代码在可读性、文件大小和性½上大为改观。
下面的规则将引导½规避½用头文件时的各种麻烦。
1. #define
的保护
所有头文件½应该½用#define 防止头文件被多重包含(multiple
inclusion),½名格式
½是:<PROJECT>_<PATH>_<FILE>_H_
为保证唯一性,头文件的½名应基于其所在项目源代码树的全路径。例如,项目 foo 中的头
文件 foo/src/bar/baz.h 按如下方式保护:
#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
...
#endif // FOO_BAR_BAZ_H_
2.
头文件依赖
½用前½声明(forward
declarations)½量减少.h
文件中#include 的数量。
½一个头文件被包含的同时也引入了一项新的依
赖
dependency),
(
只要该头文件被修改 ,
代码就要重新编译。
如果½的头文件包含了其他头文件,
这些头文件的任½改变也将导致那
些包含了½的头文件的代码重新编译。因此,我们宁可½量少包含头文件,尤其是那些包含
在其他头文件中的。
½用前½声明可以显著减少需要包含的头文件数量。举例说明:头文件中用到类
File,½不
需要访问
File
的声明,则头文件中只需前½声明 class File;无需#include
"file/base/file.h"。
在头文件如½做到½用类
Foo
而无需访问类的定义?
1)
将数据成员类型声明为
Foo *或 Foo &;
2)
参数、返回值类型为
Foo
的½数只是声明(½不定义实现);
3)
静态数据成员的类型可以被声明为
Foo,因为静态数据成员的定义在类定义之外。
另一方面,如果½的类是
Foo
的子类,或者含有类型为
Foo
的非静态数据成员,则必须为
之包含头文件。
有时,
½用指针成员
(pointer
members,
如果是 scoped_ptr 更½)
替代 对象 成员
(object
members)的确更有意义。然而,这样的做法会降½代码可读性及执行效率。如果仅仅为
了少包含头文件,还是不要这样替代的½。
½然,.cc 文件无论如½½需要所½用类的定义部分,自然也就会包含若干头文件。
译者注:½依赖声明的就不要依赖定义。
3.
内联½数
只有½½数只有
10
行甚至更少时才会将其定义为内联½数(inline
function)。
Definition
定义(Definition
Definition):½½数被声明为内联½数之后,编译器可½会将其内联展开,无需
按通常的½数调用机制调用内联½数。
优点:½½数½比较小的时候,内联该½数可以令目标代码更加高效。对于存取½数
(accessor、mutator)以及其他一些比较短的关键执行½数。
缺点:滥用内联将导致程序变慢,内联有可½是目标代码量或增或减,这取决于被内联的½
数的大小。内联较短小的存取½数通常会减少代码量,½内联一个很大的½数(译者注:如
果编译器允许的话)将戏剧性的增加代码量。在现代处理器上,由于更½的利用指令缓存
(instruction
cache),小巧的代码往往执行更快。
结 论:
一个比较得½的处理规则是,
不要内联超过
10
行的½数。
对于析构½数应慎重对待 ,
析构½数往往比其表面看起来要长,因为有一些隐式成员和基类析构½数(如果有的话)被
调用!
另一有用的处理规则:内联那些包含循环或
switch
语句的½数是得不偿失的,除非在大多
数情况下,这些循环或
switch
语句从不执行。
重要的是,虚½数和递½½数即½被声明为内联的也不一定就是内联½数。通常,递½½数
不应该被声明为内联的(译者注:递½调用堆栈的展开并不像循环那么简单,比如递½层数
在编译时可½是未知的,大多数编译器½不支持内联递½½数)。析构½数内联的主要原因
是其定义在类的定义中,为了方便抑或是对其行为给出文档。
4. -inl.h
文件
复杂的内联½数的定义,应放在后缀名为-inl.h 的头文件中。
在头文件中给出内联½数的定义,可令编译器将其在调用处内联展开。然而,实现代码应完
全放到.cc 文件中,我们不希望.h 文件中出现太多实现代码,除非这样做在可读性和效率上
有明显优势。
如果内联½数的定义比较短小、逻辑比较简单,其实现代码可以放在.h 文件中。例如,存
取½数的实现理所½然½放在类定义中。
出于实现和调用的方便,
较复杂的内联½数也可以
放到.h 文件中,如果½觉得这样会½头文件显得笨重,还可以将其分离到单独的-inl.h 中。
这样即把实现和类定义分离开来,½需要时包含实现所在的-inl.h 即可。
-inl.h
文件还可用于½数模板的定义,从而½得模板定义可读性增强。
要提醒的一点是,-inl.h 和其他头文件一样,也需要#define 保护。
5.
½数参数顺序(
Function Parameter Ordering
)
½数参数顺序(Function
Ordering)
定义½数时,参数顺序为:输入参数在前,输出参数在后。
评论