头文件应包含什么,不应包含什么?
文章知识点来自《大规模 C++ 程序设计》。
当程序具有规模的时候,编译、链接的速度跟包含的头文件有很大的关系,我们需要知道头文件中应该包含什么,不应该包含什么。
代码示例
// radio.h
#ifndef __RADIO_H__
#define __RADIO_H__
// 应包含内容
class Radio // 正确:类定义
{
static int s_count; // 正确:静态数据成员声明
static const double S_PI; // 正确:静态常量数据成员声明
int d_size; // 正确:数据成员定义
// ...
public:
int size() const; // 正确:成员函数声明
// ...
};
inline int Radio::size() const // 正确:内联函数定义
{
return d_size;
}
// 不应包含内容
int Radio::s_count; // 错误:静态数据成员定义,应放在 .cpp 文件中
double Radio::S_PI = 3.1415926; // 错误:静态常量数据成员定义,应放在 .cpp 文件中
int Radio::size() const { /*...*/ } // 错误:成员函数定义,应放在 .cpp 文件中
int z; // 错误:外部数据定义
extern int LENGTH = 10; // 错误:外部数据定义
const int WIDTH = 5; // 避免:常量数据定义
static int y; // 避免:静态数据定义
static void func() { /*...*/ } // 避免:静态函数定义
#endif // __RADIO_H__
原因
更多内容请参考原书。
在 C++ 头文件的作用域内放置带有内部链接的定义,如静态函数或数据,是合法的,但是这种做法并不理想。这样不仅污染了全局名称空间,而且包含该头文件的每一个编译单元中消耗数据空间。