头文件中一般用于写类或函数的声明。 比如有一个函数(或类)在多个程序文件中都要用到,你就得在这么多文件中都写上它的声明,一旦这个函数的原型发生了变化,你就得更新所有的用到它的文件中的声明,这是 很麻烦而且容易出错的。这就应该用头文件,把声明写在头文件中,用到这个函数(或类)的文件中就不用一一写它的声明了,只要包含这个头文件就可以了,要修改也很方便。
对同一对象、函数、类等所以声明的类型都必须一致。所以,递交给编译器的源代码以及后来被连接的东西也必须一致。要达到在不财编译单元中声明的一致性,那就是将包含界面信息的头文件包含到可执行代码或数据定义的源程序文件里,这就是头文件的目的。
作为经验法则,头文件里可以包括:
命名名字空间 namespace N {/*...*/}
类型定义 struct Point{int x, y;};
模板声明 template <class T> class Z;
模板定义 template <class T> calss V{/*...*/}
函数声明 extern int strlen(const char*);
内联函数定义 inline char get(char* p) {return *p++;}
数据声明 extern int a;
常量声明 const float pi = 3.14159
枚举 enum Light {red, yellow, green};
名字声明 class Matrix;
包含指令 #include <iostream>
宏定义 #define VERSION 2
条件编译指令 #ifdef __cplusplus
注释 // Find
而在头文件绝不能有以下东西出现:
常规函数定义 char get(char* p) {return *p++;}
数据定义 int a;
聚集量定义 int tbl[] = {1, 2, 3};
无名名字空间 namespace {/* ... */}
导出的模板定义 export template <class T> f(T t) {/*...*/}
另提醒一下大家,因为在VC7.1还没有支持标准C++中模板的 export 关键字,因此大家在VC中使用模板时,只能把模板的实现体放在头文件里。
函数声明里的形式参数可以只写类型而省略名称。