1.头文件用于声明而不是用于定义
extern int ival = 10; //初始化了,为定义,不适合放在头文件中
double dval; //没有extern,是定义,不适合放在头文件中
注意:避免防止多重定义链接错误。因为头文件包含在多个源文件中,所以不应该含有变量或函数的定义。
关于头文件不应该含有定义这一规则,有三个例外:
头文件可以定义类、值在编译时就已知道的const对象和inline函数。这些实体可在多个源文件中定义,只要每个源文件中的定义是相同的。
2.预处理器
(1)头文件经常#include其他的头文件。比如某些类的头文件必须包含string库
(2)避免多重包含,在编写头文件之前,需要引入一些额外的预处理器设施。预处理器允许我们自定义变量。预处理器变量的名字在程序中必须是唯一的。任何与预处理器变量相匹配的名字的使用都关联到该预处理器变量。
为避免名字冲突,预处理器变量经常用全大写字母表示。
预处理器变量有两种状态:已定义,未定义。
#define指示:接受一个名字并定义该名字为预处理器变量。
#ifndef指示:检测指定的预处理器变量是否未定义。如果预处理器变量未定义,那么跟在其后的所有指示都被处理,直到出现#endif
#ifndef F1_H
#define F1_H
#endif
注意:头文件应该含有保护符,即使这些头文件不会被其他头文件包含。编写头文件保护符并不困难,而且如果头文件被包含多次,它可以避免难以理解的编译错误。
3.使用自定义的头文件
#include指示接受两种形式:
#include<>: 标准头文件
#include" ": 非系统头文件,非系统头文件的查找通常开始于源文件所在的路径。
4.using声明
格式:using namespace::name;
一旦使用了using声明,我们就可以直接引用名字,而不需要再引用该名字的命名空间。
5.使用标准库类型的类定义
如果在头文件中放置using声明,就相当于在包含该头文件的每个程序中都放置了同一using声明,不论程序是否需要using声明。
注意:通常头文件中应该只定义确实必要的东西。