从编译的角度来认识头文件的作用:
主要用于类型检查,检查函数的参数及返回类型是否有错(头文件里面包含声明,与程序文件里面的调用应该保持一致)。
至于函数的实现是在函数库里面,在link连接阶段复制到你的程序编译而成的obj文件里面。
这样你的程序才能运行。就像tc里面的include目录里的文件就是头文件,lib目录里面放的就是其对应的实现。
其他观点:
(1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需按照头文件中的接口声明来调用库函数,而不必关心接口是怎么实现的。连接器会从库中提取相应的代码,并和用户的程序连接生成可执行文件或者动态连接库文件;
(2)头文件能加强类型安全检查。如果某个接口被实现或被使用时的方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担;
(3)头文件可以提高程序的可读性(清晰性)。
头文件中的元素比较多,其顺序(结构)一般应安排如下:
(1)头文件注释(包括文件说明、功能描述、版权声明等)(必须有);
(2)内部包含卫哨开始(#ifndef XXX/#define XXX)(必须有);
(3)#include其他头文件(如果需要);
(4)外部变量和全局函数声明(如果需要);
(5)常量和宏定义(如果需要);
(6)类型前置声明和定义(如果需要);
(7)全局函数原型和内联函数的定义(如果需要);
(8)内部包含卫哨结束:#endif // XXX(必须有);
(9)文件版本及修订说明。