from: http://blog.sina.com.cn/s/blog_5c3996ed0100n0rg.html
from:http://blog.youkuaiyun.com/mountzf/article/details/51767353?locationNum=6&fps=1
每个C++/C程序通常分为两个文件。一个文件用于保存程序的声明(declaration),称为头文件。另一个文件用于保存程序的实现(implementation),称为定义(definition)文件。
C++/C程序的头文件以“.h”为后缀,C程序的定义文件以“.c”为后缀,C++程序的定义文件通常以“.cpp”为后缀(也有一些系统以“.cc”或“.cxx”为后缀)。
1,头文件可以定义所用的函数列表,方便查阅你可以调用的函数;
2,头文件可以定义很多宏定义,就是一些全局静态变量的定义,在这样的情况下,只要修改头文件的内容,程序就可以做相应的修改,不用亲自跑到繁琐的代码内去搜索。
3,头文件只是声明,不占内存空间,要知道其执行过程,要看你头文件所申明的函数是在哪个.c文件里定义的,才知道。
4,他并不是C自带的,可以不用。
5,调用了头文件,就等于赋予了调用某些函数的权限,如果你要算一个数的N次方,就要调用Pow()函数,而这个函数是定义在math.c里面的,要用这个函数,就必需调用math.h这个头文件。
1.2
头文件由三部分内容组成:
(1)头文件开头处的版权和版本声明(参见示例1-1)。
(2)预处理块。
(3)函数和类结构声明等。
假设头文件名称为
【规则1-2-1】为了防止头文件被重复引用,应当用ifndef/define/endif结构产生预处理块。
【规则1-2-2】用
【规则1-2-3】用
【建议1-2-1】头文件中只存放“声明”而不存放“定义”
在C++
【建议1-2-2】不提倡使用全局变量,尽量不要在头文件中出现象extern
//
#ifndef
#define
#include
…
#include
…
void
…
class
#endif
示例1-2
1.3
定义文件有三部分内容:
(1)
(2)
(3)
假设定义文件的名称为
//
#include
…
//
void
//
void
示例1-3
1.4
早期的编程语言如Basic、Fortran没有头文件的概念,C++/C语言的初学者虽然会用使用头文件,但常常不明其理。这里对头文件
的作用略作解释:
(1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用
户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。
(2)头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这
一简单的规则能大大减轻程序员调试、改错的负担。
1.5 注意:
并不是所有的变量都能用extern声明,只有全局变量并且没有被static 声明的变量才能声明为extern. 所以如果你不想自己源文件中全局的变量被其他文件引用,你就可以给变量加上static声明。
非const变量默认为extern ,const变量默认为文件的局部变量。而const变量如果想要在其他文件里被访问,必须显示的指定它为extern。如果const对象在编译时可以确定其值,可以将其放在头文件中定义。这么做是有原因的——const对象默认情况下是定义该变量的文件的局部变量,这样即使此头文件被多个包含,都不会在包含这些文件中重复定义此变量,所有对于这个const对象的引用全都指向在头文件中定义的对象。如果在const对象定义的时候声明extern,const对象就变得和普通非const对象一样,从而失去此特性(非const对象的默认属性为extern)。
所以,总结如下:
- 如果是要定义全局变量,那么在头文件中用extern关键字声明,然后在另一个.cpp文件中定义;
- 如果是要声明一个不想被其他文件使用、只能被本文件使用的变量,可以用static关键字在头文件中进行定义;
- 如果所要定义的变量为局部变量,并且其值在编译时就已经可以确定,就可以用const关键词在头文件中进行定义。