谷歌CPP 编程规范-- 每天看点,多了也记不住,在实践中改变自己的代码风格吧!
Cpp文件的命名是.cc而不是.cpp,这点不是很明白,为什么不用cpp,而是用cc
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Scoping
1. 头文件
#define 保护
每个头文件都应该有#define来防止多次被包含,定义应该是在工程目录中的完整路径,例如文件 foo/src/bar/baz.h 在工程foo中应该用如下的方式来保护
#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
…
#endif //FOO_BAR_BAZ_H
头文件依赖
在前向声明可以实现要求的时候,不要使用#include
当一个头文件被引用的时候,一个依赖关系就被建立了,当被包含的头文件被改变的时候,其他的文件就要被重新编译。所以要尽量避免#include的使用
用户可以使用前向声明来减少#include的使用,例如当你的头文件使用File类,但是不需要访问它的声明的时候,你就可以使用前向声明而不是 #include “file/base/file.h”
那么什么时候在头文件中使用一个类Foo,却不需要访问它的定义呢
1. 声明数据成员 Foo * 或者 Foo &
2. 我们可以用类型Foo声明函数参数或者返回值
3. 可以声明一个静态的成员Foo,因为静态成员的定义是在类的外部
但是如果类中有Foo类型的数据成员的时候,就要#include了
有时候使用指针成员而不是对象成员是有意义的,然后这使得程序可读性和性能降低,所以如果仅仅为了使得少使用#include而强迫使用指针成员是不值得的
Note: 如果符号Foo的使用是在源文件中,这个时候应该导入Foo的定义,或者通过#include或者前向声明。
内联函数
在代码很小,少于10行的时候,可以使用内联函数
定义
你可以声明一个函数为内联,使得编译器在调用函数的位置展开他们,而不是采用一般的函数调用机制
支持的做法
内联可以提高目标代码效率,所以小函数尽量使用内联,例如set get方法或者其他的对效率要求比较高的代码
不支持的做法
如果代码大于10行,就不要使用内联了。注意析构函数,因为隐式成员函数和基类析构的调用使得他们的代码通常要大于10行。
循环和switch存在的函数不要使用内联
有些时候尽管有内联声明,但是函数却未必内联。例如虚函数,递归。通常虚函数的作用是在类中占一个定义,而不是出于方便或者实现它的行为。
-inl.h文件
当需要的时候,可以使用inl.h文件来定义复杂的内联函数
短的内联函数,可以在.h中直接定义,例如get set方法。如果代码比较长的的时候,又不想把内联函数的定义放在.cc文件中,可以使用-inl.h文件来定义内联函数,这使得内联实现和类实现分来,同时允许实现在需要的地方包含进来。
-inl.h另一个用途是定义模板,它使得模板定义容易读懂,和普通的.h一样,使用#define guard
函数参数的排序
参数排序的方式为:输入,输出
c/c++参数要么是输入,要么是输出,或者既是输入又是输出(例如指针,引用)。输入参数经常是值或者常引用,输出是非常量的指针。声明参数的时候,输入参数在前,不要图方便在后面加参数,确保输入参数在前面。
Includes 的名字和排序
使用标准的排序保证可读性,同时避免隐藏的依赖:C库,C++库,其他库,自定义的.h
对于.cc文件而言,例如foo2.cc
1. Dir2/foo2.h
2. C 系统库
3. Cpp库
4. 其他库
5. 工程其他.h
例如
#include “foo/public/foosever.h” //对应的.h
#include <sys/types.h> //C库
#include <unistd.h>
#include<hash_map> //C++库
#include<vector>
#include “base/basictypes.h” //其他的工程.h
#include “base/commandlineflags.h”
#include “foo/public/bar.h”