Header 文件
头文件是扩展名为.h的文件,其中包含要在多个源文件之间共享的C函数声明和宏定义。 头文件有两种类型:程序员编写的文件和编译器附带的文件。
您要求在程序中使用头文件,方法是将其与C预处理指令#include ,就像您已经看到包含stdio.h头文件一样,该文件随编译器一起提供。
包含头文件等于复制头文件的内容,但我们不这样做,因为它容易出错,并且在源文件中复制头文件的内容不是一个好主意,特别是如果我们在程序中有多个源文件。
C或C ++程序中的一个简单实践是我们将所有常量,宏,系统范围的全局变量和函数原型保存在头文件中,并在任何需要的地方包含该头文件。
包括语法
使用预处理指令#include包括用户和系统头文件。 它有以下两种形式 -
#include <file>
此表单用于系统头文件。 它在标准的系统目录列表中搜索名为“file”的文件。 在编译源代码时,可以使用-I选项将目录添加到此列表中。
#include "file"
此表单用于您自己的程序的头文件。 它在包含当前文件的目录中搜索名为“file”的文件。 在编译源代码时,可以使用-I选项将目录添加到此列表中。
包括操作
#include指令通过指示C预处理器将指定文件作为输入进行扫描,然后继续使用当前源文件的其余部分。 预处理器的输出包含已生成的输出,后跟包含文件的输出,然后是#include指令后的文本输出。 例如,如果您有一个头文件header.h如下 -
char *test (void);
以及一个名为program.c的主程序,它使用头文件,如下所示 -
int x;
#include "header.h"
int main (void) {
puts (test ());
}
编译器将看到与program.c读取时相同的令牌流。
int x;
char *test (void);
int main (void) {
puts (test ());
}
Once-Only Headers
如果头文件恰好包含两次,编译器将处理其内容两次,这将导致错误。 防止这种情况的标准方法是将文件的整个实际内容包含在条件中,如下所示 -
#ifndef HEADER_FILE
#define HEADER_FILE
the entire header file file
#endif
此构造通常称为包装器#ifndef 。 当再次包含标题时,条件将为false,因为定义了HEADER_FILE。 预处理器将跳过文件的整个内容,编译器将不会看到它两次。
计算包含
有时需要选择要包含在程序中的几个不同头文件中的一个。 例如,他们可能会指定要在不同类型的操作系统上使用的配置参数。 您可以通过以下一系列条件执行此操作 -
#if SYSTEM_1
# include "system_1.h"
#elif SYSTEM_2
# include "system_2.h"
#elif SYSTEM_3
...
#endif
但随着它的增长,它变得乏味,而预处理器提供了使用宏作为标题名称的能力。 这称为computed include 。 您只需将宏名称放在那里,而不是将标题名称作为#include的直接参数写入 -
#define SYSTEM_H "system_1.h"
...
#include SYSTEM_H
SYSTEM_H将被扩展,预处理器将查找system_1.h,就像#include最初是以这样的方式编写的一样。 SYSTEM_H可以由Makefile使用-D选项定义。