《Google的C++编码规范》阅读随笔 —— 第一章 头文件

第一章 头文件
每一个.c文件都有一个对应的.h文件,例外的一般只有main(),因此需要正确的使用头文件

  1. define保护:

所有的头文件都应该使用#define,防止头文件被多重包含,命名格式为H
例如:项目foo(foo/src/bar/baz.h)中的头文件
#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
...
#endif //FOO_BAR_BAZ_H_

  1. 头文件依赖
    使用前置声明尽量减少.h文件中#include的数量
    当一个头文件被包含的同时也引入了一项新的依赖,只要该头文件被修改,代码就要重新编译。
    使用前置声明可以显著的减少需要包含的头文件数量,例:头文件中需要用到类File,但不需要访问File的声明,
    则头文件中只需要前置声明class File;无需#include "file/base/file.h"。

如何在头文件中做到使用类Foo而无需访问类的定义:
1)将数据成员类型声明为Foo *或者Foo &
2)参数、返回值类型为Foo的函数只是声明(不定义实现)
3)静态数据成员的类型可以被声明为Foo,因为静态数据成员的定义在类定义之外。
另外一方面如果你的类是Foo的子类,或者含有类型为Foo的非静态数据成员,则必须为之包含头文件

3.内联函数
不要内联超过10行的函数,对与析构函数应该慎重对待,析构函数旺旺比其表面看起来要长,因为一些隐式成员和基类析构函数被调用

内联那些包含循环或者switch语句的函数是得不偿失的,除非在大多数情况下,这些循环或switch语句从不执行

  1. -inl.h文件:(也需要#define保护)
    复杂的内联函数的定义,因该放在后缀名为-inl.h的头文件中。
    -inl.h文件还可以用于函数模板的定义,从而使模板定义可读性增强

5.函数参数顺序
定义函数时,参数顺序为:输入参数在前,输出参数在后
输入参数一般传值或常数引用,输出参数为非常数指针。
输入/输出两用参数(通常是类/结构体变量)混在其中,会使得规则难以遵循

6.包含文件的名称及次序
将包含次序标准化可增强可读性,避免隐藏依赖(隐藏依赖主要指包含的文件编译),
次序如下:C库、C++库、其他库的.h、项目内的.h
例如:dir/foo.c的主要作用是执行或者测试dir2/foo2.h的功能,foo.c的头文件的如下:
dir/foo2.h
C系统文件
C++系统文件
其他库头文件
本项目内头文件
这种排序方式可有效减少隐藏依赖,我们希望每一个头文件独立编译。最简单的实现方式是将其作为第一个.h文件件包含在对应的.c中
相同目录下的头文件按字母排序即可

7.总结:
避免多重包含是学编程时最基本的要求
前置声明是为了降低编译依赖,防止修改一个头文件引发多米诺效应
内联函数的合理使用可提高代码执行效率
-inl.h可提高代码可读性(一般用不到)
标准化函数参数顺序可以提高可读性和易维护性(对函数参数的堆栈空间有轻微影响,之前可能大多是相同类型放一起)
包含文件的名称使用.和..虽然方便却易混乱,使用完整项目路径更清晰,可以减少隐藏依赖,使每个头文件在“最需要编译”(对应的源文件处)的地方编译

你可能感兴趣的:(《Google的C++编码规范》阅读随笔 —— 第一章 头文件)