C头文件的作用(转)

来源:互联网 发布:php的mime类型是什么 编辑:程序博客网 时间:2024/05/21 06:24
在 C语言家族程序中,头文件被大量使用。一般而言,每个C++/C程序通常由头文件(header files)和定义文件 (definition files)组成。头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(declaration),而定 义文件用于保存程序的实现 (implementation)。
C++/C程序的头文件以“.h”为后缀。以下是假设名称为 graphics.h的头文件:
#ifndef GRAPHICS_H (作用:防止graphics.h被重复引用)
#define GRAPHICS_H
#include.... (作用:引用标准库的头文件)
...
#include... (作用:引用非标准库的头文件)
...
void Function1(...); (作用:全局函数声明)
...
class Box (作用:类结构声明)
{
...
};
#endif
从以上例子可以看出,头文件一般由三部分内容组成:(1)头文件开头处的版权和版本声明;(2)预处理块;(3)函数和类结构声明等。在头文 件中,用 ifndef/define/endif结构产生预处理块,用 #include 格式来引用库的头文件。头文件的这种结构,是利用C语言进行 开发软件所通常具备的,属于公有知识。
一般在一个应用开发体系中,功能的真正逻辑实现是以硬件层为基础,在驱动程序、功能层程序以及用户的应用程序中完成的。根据以上示例,可以 发现头文件的主要作用在于调用库功能,对各个被调用函数给出一个描述,其本身不包含程序的逻辑实现代码,它只起描述性作用,告诉应用程序通过相应途径寻找 相应功能函数的真正逻辑实现代码。用户程序只需要按照头文件中的接口声明来调用库功能,编译器会从库中提取相应的代码。
从以上结构图来看,头文件是用户应用程序和函数库之间的桥梁和纽带。在整个软件中,头文件不是最重要的部分,但它是C语言家族中不可缺少的 组成部分。做一个不算很恰当的比喻,头文件就像是一本书中的目录,读者(用户程序)通过目录,可以很方便就查阅其需要的内容(函数库)。在一本书中,目录 固然重要,但绝对不是一本书的核心的、最重要的部分。


10.2  文件的结构

C++/C源程序通常分为两类文件。一类文件用于保存程序的声明,称为头文件;另一类文件用于保存程序的实现,称为源文件(或者定义文件)。

C++/C程序的头文件以“.h”为后缀,C程序的源文件以“.c”为后缀,C++程序的源文件通常以“.cpp”为后缀(也有一些系统以“.cc”或“.cxx”为后缀)。

C++/C编译器在扫描到一条函数调用语句时首先应当知道该函数的原型或定义,函数原型一般都放在头文件中,函数定义则放在源文件中,当源文件或 头文件通过#include指令包含另一个头文件的时候,编译预处理器用头文件的内容取代#include伪指令。这就是说,头文件的所有内容最终都会被 合并到某一个或某几个源文件中,如此将每一个包含的头文件递归地展开后形成的源文件就叫编译单元。

10.2.1  头文件的用途和结构

早期的编程语言如BASIC、Fortran没有头文件的概念,C++/C语言的初学者虽然会使用头文件,但常常不明其理。这里对头文件的作用略做解释。

【提示10-2】: 

(1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需按照头文件中的接 口声明来调用库函数,而不必关心接口是怎么实现的。连接器会从库中提取相应的代码,并和用户的程序连接生成可执行文件或者动态连接库文件;

(2)头文件能加强类型安全检查。如果某个接口被实现或被使用时的方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担;

(3)头文件可以提高程序的可读性(清晰性)。

头文件中的元素比较多,其顺序(结构)一般应安排如下:

(1)头文件注释(包括文件说明、功能描述、版权声明等)(必须有);

(2)内部包含卫哨开始(#ifndef XXX/#define XXX)(必须有);

(3)#include其他头文件(如果需要);

(4)外部变量和全局函数声明(如果需要);

(5)常量和宏定义(如果需要);

(6)类型前置声明和定义(如果需要);

(7)全局函数原型和内联函数的定义(如果需要);

(8)内部包含卫哨结束:#endif   // XXX(必须有);

(9)文件版本及修订说明。

上述排列顺序并非绝对,也不存在对错之分,可根据具体情况灵活安排。

如果程序中需要内联函数,那么内联函数的定义应当放在头文件中,因为内联函数调用语句最终被扩展开来而不是采用真正的函数调用机制。
0 1
原创粉丝点击