《Google C++编码规范》第一章:头文件
c++源文件在windows系统.cpp
,在Linux/Unix下则为.cc
,通常一个源文件对应一个.h
头文件。正确使用头文件令代码在可读性,性能上都有很大的改观
1.#define的保护
#define
是一种防御式声明,防止头文件被多重包含,命名格式:<PROJECT>_<PATH>_<FILENAME>_H_
,例如:foo/src/bar/baz.h的声明如下
#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
...
#endif //FOO_BAR_BAZ_H_
2.头文件依赖
使用前置声明来减少.h
头文件中include的数量。
头文件的引入就是一种依赖,一旦该头文件发生改变,代码就要重新编译。
使用前置声明就可以有效解决这个问题。例如在头文件中要用到类file,需要访问file的声明,头文件只需前置声明class file,而并不需要#include "file.h"
在头文件中如何做到使用类file的声明而无需访问类的定义呢?
1. 将成员声明为file*
或者file&
;
2. 参数,返回值类型为file
的函数只是声明(不是定义);
3. 静态数据成员可以声明为file
。
除了这几种情况外,都必须#include "file.h"
,尤其:
1. 如果类是file的子类;
2. 含有的是file非静态成员。
源文件则不可避免要包含头文件,能依赖声明就不要依赖定义。
3.inline函数
只有当函数小于十行才有可能被定义成内联函数。内联是一种请求,编译器可以拒绝。
定义:内联展开的含义是在函数每一个调用的地方都用函数本体替换之(和宏类似)。
1. 优点:函数体比较小时,内联函数将更加高效;
2. 缺点:滥用内联函数将导致程序变慢,当内联函数很小时目标代码量会减少,当内联函数很大时目标代码量会增加。
对于析构函数,要谨慎使用内联。首先虚析构函数一般是无法内联的,因为内联是一种编译器行为,而多态是一种运行期行为。另外,因为析构函数往往比起表面看起来要长的多。对于递归函数和虚函数,一般也无法内联。
4.-inl.h文件
复杂的内联函数的定义,应该放到后缀名为-inl.h
的头文件中。-inl.h
头文件也需要#define
保护。
5.函数的参数顺序
输入参数在前,输出参数在后。输入参数通常为const reference
,输出参数通常为non-const reference
。
6.包含头文件的名称和顺序
顺序通常为:C库,C++库,其它的库,项目内的库。
作用:可增强可读性、避免隐藏依赖。
相同目录下按字母排序是一个不错的选择。