本文所学习的GooGle规范下载于:
博客作者:skyseraph 出处:http://www.cnblogs.com/skyseraph/
连接:https://www.cnblogs.com/skyseraph/archive/2011/03/09/1978677.html
若有侵权,请立即连接,以便删除。
前言:虽然Google的风格很规范,可是一万个人有一万个哈姆雷特,所以结合规范风格,引申出适合自己的风格才是最好的。
1.头文件
1.1#define保护
用于防止某个.h文件被多重包含,命名格式<PROJECT>_<PATH>_<FILE>_H_
Ex:为保证唯一性, 头文件的命名应该依据所在项目源代码树的全路径. 例如, 项目 foo 中的头文件 foo/src/bar/baz.h 可按如下方式保护:
#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
…
#endif // FOO_BAR_BAZ_H_
如果项目不是太大,许多.h文件实唯一的,可简单的使用<FILE>_H_即可,上面写成
#ifndef BAZ_H_
#define BAZ_H_
…
#endif // BAZ_H_
1.2头文件依赖
当某个文件被包含的同时,这个文件又包含了其他的头文件,那么当这个文件修改时,代码会重新编译,而这个头文件所包含的文件也会被重新编译、、,这样依次会导致许多文件被过多编译。
所以使用前置声明来减少需要包含的头文件数量。
Ex:
如果头文件中用到类File,可是不需要访问File的声明(即不用函数等等),那么头文件只需前置声明class File;而 不用#include “file.h
而此时你能用分类操作为:
- 我们可以将数据成员类型声明为 Foo * 或 Foo &.
- 我们可以将函数参数 / 返回值的类型声明为 Foo (但不能定义实现).
- 我们可以将静态数据成员的类型声明为 Foo, 因为静态数据成员的定义在类定义之外.
可是记住:不要为了减少头文件的包含,而过多的使用指针来代替对象成员。
1.3内联函数
只有当函数只有 10 行甚至更少时才将其定义为内联函数.
这里不做讨论,因为一般情况下,用的很少。
只写一些经验:
一个较为合理的经验准则是, 不要内联超过 10 行的函数. 谨慎对待析构函数, 析构函数往往比其表面看起来要更长, 因为有隐含的成员和基类析构函数被调用!
内联那些包含循环或 switch 语句的函数常常是得不偿失 (除非在大多数情况下, 这些循环或 switch 语句从不被执行).
有些函数即使声明为内联的也不一定会被编译器内联, 这点很重要; 比如虚函数和递归函数就不会被正常内联. 通常, 递归函数不应该声明成内联函数.(
1.4 -inl.h
这是用来存储内联函数的实现的,一般内联函数的实现放在对应的.h文件里面,可是当内联函数过大时,会造成.h文件的笨重,所以可以将内联函数写到-inl.h文件进行实现。
1.5 函数参数的顺序
定义函数时, 参数顺序依次为: 输入参数, 然后是输出参数.
C/C++ 函数参数分为输入参数, 输出参数, 和输入/输出参数三种. 输入参数一般传值或传 const 引用, 输出参数或输入/输出参数则是非-const 指针. 对参数排序时, 将只输入的参数放在所有输出参数之前. 尤其是不要仅仅因为是新加的参数, 就把它放在最后; 即使是新加的只输入参数也要放在输出参数.
这条规则并不需要严格遵守. 输入/输出两用参数 (通常是类/结构体变量) 把事情变得复杂, 为保持和相关函数的一致性, 你有时不得不有所变通.
1.6 #include的路径即顺序
使用标准的头文件包含顺序可增强可读性, 避免隐藏依赖: C 库, C++ 库, 其他库的 .h, 本项目内的 .h.
我们希望每一个头文件都是可被独立编译的 (yospaly 译注: 即该头文件本身已包含所有必要的显式依赖), 最简单的方法是将其作为第一个 .h 文件 #included 进对应的 .cc.
- dir2/foo2.h (优先位置, 详情如下)
- C 系统文件
- C++ 系统文件
- 其他库的 .h 文件 //该处在小项目之中往往只有一个项目,所以此处这时可省略
- 本项目内 .h 文件
Ex:google-awesome-project/src/foo/internal/fooserver.cc 的包含次序如下:
#include "foo/public/fooserver.h" //
#include <sys/types.h>
#include <unistd.h>
#include <hash_map>
#include <vector>
#include "base/basictypes.h"
#include "base/commandlineflags.h"
#include "foo/public/bar.h"
总结:
1.避免多重包含
2.合理使用前置声明,减少可能存在的额外编译
3.合理使用内联函数,提高代码效率
4.根据自己的想法进行函数位置排序
5.合理编排文件的头文件排序