13-使用头文件
16.5.2 使用头文件
浏览任何一个标准头文件都可以了解头文件的基本信息。头文件中最常用的形式如下。
- 明示常量 ——例如,
stdio.h
中定义的EOF
、NULL
和BUFSIZE
(标准I/O缓冲区大小)。 - 宏函数 ——例如,
getchar()
通常用getc(stdin)
定义,而getc()
经常用于定义较复杂的宏,头文件ctype.h
通常包含ctype
系列函数的宏定义。 - 函数声明 ——例如,
string.h
头文件(一些旧的系统中是strings.h
)包含字符串函数系列的函数声明。在ANSI C和后面的标准中,函数声明都是函数原型形式。 - 结构模版定义 ——标准I/O函数使用
FILE
结构,该结构中包含了文件和与文件缓冲区相关的信息。FILE
结构在头文件stdio.h
中。 - 类型定义 ——标准I/O函数使用指向
FILE
的指针作为参数。通常,stdio.h
用#define
或typedef
把FILE
定义为指向结构的指针。类似地,size_t
和time_t
类型也定义在头文件中。
许多程序员都在程序中使用自己开发的标准头文件。如果开发一系列相关的函数或结构,那么这种方法特别有价值。
另外,还可以使用头文件声明外部变量供其他文件共享。例如,如果已经开发了共享某个变量的一系列函数,该变量报告某种状况(如,错误情况),这种方法就很有效。这种情况下,可以在包含这些函数声明的源代码文件定义一个文件作用域的外部链接变量:
int status = 0; // 该变量具有文件作用域,在源代码文件
然后,可以在与源代码文件相关联的头文件中进行引用式声明:
extern int status; // 在头文件中
这行代码会出现在包含了该头文件的文件中,这样使用该系列函数的文件都能使用这个变量。虽然源代码文件中包含该头文件后也包含了该声明,但是只要声明的类型一致,在一个文件中同时使用定义式声明和引用式声明没问题。
需要包含头文件的另一种情况是,使用具有文件作用域、内部链接和 const
限定符的变量或数组。 const
防止值被意外修改, static
意味着每个包含该头文件的文件都获得一份副本。因此,不需要在一个文件中进行定义式声明,在其他文件中进行引用式声明。
#include
和 #define
指令是最常用的两个C预处理器特性。接下来,我们介绍一些其他指令。