闲来无事,学习google c++编码规范,英语不好翻译不对的地方请各位大神指正。
头文件
一般来说,每个cpp文件都会有相应的头文件。当然也有例外的情况,比如仅仅包含main方法的cpp文件。正确的使用头文件,可以使你的代码在大小,可读性和性能方面产生巨大的差异。以下的规则将引导你避免使用头文件的误区
一、#define
保护
所有的头文件应该有#define 保护以防止头文件被多次包含,标记命名格式为PROJECT>___H_。为保证标记唯一性,名称应该根据工程文件目录的全称路径。例如有一个foo工程下的一个头文件foo/src/bar/baz.h,标记可以这么定义
#ifndefFOO_BAR_BAZ_H_
#defineFOO_BAR_BAZ_H_
....
#endif// FOO_BAR_BAZ_H_
二、前置声明
前置声明可以避免不必要的#include包含。
定义:前置声明是对于类,方法或者模版的没有相关定义的一种声明。当这些符号只是被客户代码使用时,#include包含其实可以用前置声明替换。
优点:
1、
不必要的#include包含导致编译器打开更多的文件和处理更多的输入。
2、
头文件一旦有更改,这些包含也会使得代码经常被重新编译。
缺点:
1、
当前置声明中有模版,typedef声明,默认参数和using
声明时,前置声明很难确定它们的正确格式。
2、
对于一段给定的代码,很难决定是用前置声明还是#include包含,尤其是代码中存在隐式类型转换方法时。在极端的情况下,用#include包含替换前置声明会不知不觉的改
变了你的代码的含义。
3、
为来自同一个头文件的多个符号进行前置声明比#include包含会显得很冗长
4、
对方法和模版前置声明会阻止头文件的拥有者对API进行不兼容的改动。例如扩展参数类型或者添加带默认值的模版参数
5、
为std::命名空间中的符号进行前置声明通常会引发未定义行为
6、
为了使用前置声明而构建代码通常会使代码变得更加慢和复杂。例如用指针成员代替对象成员。
7、
前置声明的实际效率并没有得到证明。
决定:
1、
当使用头文件中声明的一个方法时,总是用#include包含头文件
2、
当使用类模版时,最好使用#include包含头文件
3、
当使用的是普通的类,可以使用前置声明,但是要小心前置声明的不足和不正确的情况,如果不确定,那就用#include
4、
不要为了避免使用#include而用指针代替数据成员