1. #define保护
所有头文件都应该使用 #define 防止头文件被 多重包含(multiple inclusion)
命名格式 <PROJECT>_<PATH>_<FILE>_H_
#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
...
#endif // FOO_BAR_BAZ_H_
2 头文件依赖
当一个头文件被包含的同时也引入了一项新的依赖(dependency),只要该头文件更改,代码就要重新编译, 使用前置声明(forward declarations) 尽量减少.h 文件中#include的数量
用前置声明 class Temp ; 可以显著减少需要重新编译的头文件数量。
在头文件中使用类 Temp 而无需访问类的定义?
1) 将数据成员类型声明为 Temp* 或 Temp&
2) 参数、返回值类型为 Temp 的函数只是声明(但不定义实现)
3) 静态数据成员的类型可以被声明为Temp 因为静态数据成员的定义在类定义之外
如果 你的类为 Temp的子类,或者含有类型为 Temp 的非静态数据成员,则必须包含头文件
.cc 文件无论如何都需要所使用类的定义部分,自然也就会包含若干头文件。
3 inline function
函数只有10行甚至更少 才会将其定义为 内联函数
定义(Definition):函数声明为内联函数,编译器可能会将其内联展开,无需按通常的函数调用机制调用内联函数
优点:当函数体比较小的时候,内联该函数可以令目标代码更加高效。对于存取函数(accessor、mutator)以及其他一些比较短的关键执行函数。
缺点:滥用内联将导致程序变慢,内联有可能是目标代码量或增或减,这取决于被内联的函数的大小。
在现代处理器上,由于更好的利用指令缓存(instruction cache),小巧的代码往往执行更快。
结论:一个比较得当的处理规则是,不要内联超过10 行的函数。
对于析构函数应慎重对待,析构函数往往比其表面看起来要长,因为有一些隐式成员和基类析构函数(如果有的话)被调用!
重要的是,虚函数和递归函数即使被声明为内联的也不一定就是内联函数。通常,递归函数不应该被声明为内联的
(译者注:递归调用堆栈的展开并不像循环那么简单,比如递归层数在编译时可能是未知的,大多数编译器都不支持内联递归函数)。
析构函数内联的主要原因是其定义在类的定义中,为了方便抑或是对其行为给出文档。
4 -inl.h
这样即把实现和类定义分离开来,当需要时包含实现所在的-inl.h 即可。-inl.h 文件还可用于函数模板的定义,从而使得模板定义可读性增强。
要提醒的一点是,-inl.h 和其他头文件一样,也需要#define 保护。
5 函数参数顺序
定义函数时, 参数顺序为: 输入参数在前,输出参数在后
输入参数一般传值或常数引用(const references)
输出参数或输入/输出参数为非常数指针(non-const pointers)
6 包含文件的名称及次序
次序如下:
同名h文件
C 系统文件
C++系统文件
其他库头文件
本项目内头文件