C语言入门教程
OutOfMemory.CN技术专栏-> C语言-> C语言入门教程-> C语言头文件深入理解

C语言头文件深入理解

C语言程序中,源文件通常分为两种:一种用于保存程序的声明(declaration),称为头文件;另一种用于保存程序的实现(implementation),称为定义(definition)文件。C程序的
C语言程序中,源文件通常分为两种:一种用于保存程序的声明(declaration),称为头文件;另一种用于保存程序的实现(implementation),称为定义(definition)文件。 C程序的头文件以“.h”为后缀,C 程序的定义文件以“.c”为后缀。

可以将 .h 文件的内容写在 .c 文件中,也可以将 .c 文件的内容写在 .h 中,但这是很不好的习惯。许多初学者用了头文件,却不明其理。在此略作说明。

在以下场景中会使用头文件:
  • 通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功 能,而不必关心接口怎么实现的。
  • 多文件编译。将稍大的项目分成几个文件实现,通过头文件将其他文件的函数声明引入到当前文件。
  • 头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。

编译时只有函数声明没有函数定义是完全正确的。函数声明告诉编译器该函数已经存在,但是入口地址还未确定,暂时在此做个标记,链接时编译器会找到函数入口地址,并将标记替换掉。

编译产生的 .obj 文件(Linux下为 .o 文件)已经是二进制文件,与 .exe 的组织形式类似,只是有些函数的入口地址还未找到,程序不能执行。链接的作用就是找到函数入口地址,将所有的源文件组织成一个可以执行的二进制文件。

关于头文件的内容,初学者还必须注意:
  • 头文件中可以和C程序一样引用其它头文件,可以写预处理块,但不要写具体的语句。
  • 可以申明函数,但不可以定义函数。
  • 可以申明常量,但不可以定义变量。
  • 可以“定义”一个宏函数。注意:宏函数很象函数,但却不是函数。其实还是一个申明。
  • 结构的定义、自定义数据类型一般也放在头文件中。
  • #include <filename.h>,编译系统会到环境指定的目录去引用。#include "filename.h",系统一般首先在当前目录查找,然后再去环境指定目录查找。

好的风格是成功的关键,版本申明、函数功能说明、注释等是C语言程序的一部分。不养成很好的习惯则不能成为C语言高手(专业人员)。

C标准库中,每一个库函数都在一个头文件中声明,可以通过 #include 预处理命令导入。

头文件只是声明,不占内存空间,编译时会被合并到源文件;要想知道它的具体实现,要看头文件所声明的函数是在哪个 .c 文件里定义的,然后查看源代码。

C标准库共包含 15 个头文件,可以分为 3 组,如何正确并熟练的使用它们,可以相应的可区分出 3 个层次的程序员:
  • 合格程序员:<stdio.h>、<ctype.h>、<stdlib.h>、<string.h>
  • 熟练程序员:<assert.h>、<limits.h>、<stddef.h>、<time.h>
  • 优秀程序员:<float.h>、<math.h>、<error.h>、<locale.h>、<setjmp.h>、<signal.h>、<stdarg.h>

各个头文件的具体内容请查看:C语言标准库

C语言头文件具有以下几个特性:
  • 幂等性。可以多次包含相同的标准头文件,但效果与只包含一次相同。
  • 相互独立。任何标准头文件的正常工作都不需要以包含其他标准头文件为前提。也没有任何标准头文件包含了其他标准头文件。
  • 和文件级别的声明等同。必须先把某标准头文件包含到你的程序中, 然后才能使用该头文件已定义或声明的东西。不能在声明中包含标准头文件。并且,也不能在包含标准头文件之前用宏定义去代替关键字。

等幂性是很容易实现的,对于大多数的头文件可以使用宏保护。例如,在 stdio.h 中可以有如下的宏定义:
#ifndef _STDIO_H
#define _STDIO_H
/* 主要实现部分 */
#endif

在C程序员中所达成的一个约定是:C源文件的开头部分要包含所有要用到的头文件。在 #include 指令之前只能有一句注释语句。引入的头文件可以按任意顺序排列。

如果我们自己编写的头文件可能会用到标准头文件中的定义或者声明,最好把标准头文件包含在自定义头文件的开头。这样,就不会在程序中忘记引入该标准头文件,也不会有顺序问题。这正是利用了头文件的等幂性。

注意一个约定,引入标准头文件用尖括号,引入自定义头文件用双引号,例如:
#include <stdio.h>
#include "myFile.h"

C语言库函数是头文件的最佳实践,仔细阅读各个头文件的内容,尤其是 stdio.h,能够学到很多东西。

在 VC6.0 中找到头文件

C标准头文件,例如 stdio.h、string.h 等在 VC6.0 的安装目录中是可以找到的。我的 VC6.0 安装在 C:\Program Files\Microsoft Visual Studio\ 目录,那么 VC6.0 附带的所有头文件(包括但不限于标准头文件)都在 C:\Program Files\Microsoft Visual Studio\VC98\Include\ 目录下。

如果忘记 VC6.0 的安装目录或者头文件不在安装目录下,可以通过以下方式找到:

1) 在工具栏中点击“工具”按钮

2) 在二级菜单中选择“选项”

3) 在弹出的对话框中选择“目录”标签

4) 然后选择名字为“目录”的下拉菜单中的“Include files”一项,如下图所示:

© 内存溢出 OutOfMemory.CN