头文件一般包含1、类的定义,2、extern变量的声明, 3、函数的声明;
规则1: 头文件是用于声明的,而不是用于定义;
下面语句不应该出现在头文件中:
extern int val = 10; //虽然加了extern关键字,但这仍是一个定义,因为对val进行了初始化赋值;
double fica_rate; //这也是一个定义:定义了一个double型变量fica_rate, 为fica_rate分配了内存空间;
正确写法:
extern doublefica_rate;
extern int function1();
规则2:类的定义、值在编译时已知道的const对象、inline函数 最好写在头文件中;
#解析:
c++中任何变量都只能定义一次,定义会分配存储空间,而所有对该变量的使用都关联到同一存储空间。但头文件可能会被包含在多个源文件中,同一个程序中有两个以上文件含有规则1中的例子的定义,就会导致多重定义链接错误。
为什么规则2中的所述的变量可以写在头文件中?
因为编译器需要知道这些尸体的定义(不只是声明)来产生代码。
对于类定义:编译器需要知道类该类的数据成员,和能够在这些对象上执行的操作;
对于const对象: const对象默认是定义该对象的局部变量。所以把它们放在头文件是合法的。在头文件中定义了const变量后,每个包含该头文件的源文件都有自己的const变量,其名称和值都一样,但存储空间不一样。 如果const变量不是已知的(不是用常量表达式初始化的),它就不应该定义在头文件中。
规则3:避免头文件被多重包含
因为头文件经常会包含其他头文件。例如,定义类A的头文件(假如是A.h)需要包含string.h(A类含有一个string类型数据成员,因此必须可以访问string头文件),而一个程序需要使用A类包含了A.h,这个程序同时也需要使用string库包含了string.h, 该程序不知道A.h已经包含了string.h, 这时string头文件就被包含了两次;
为避免多次包含同一头文件,应该在头文件中加入 预处理器变量:
#ifndef SALESITE_H
#define SALESITE_H
// 在此添加头文件中定义
#endif