C - 头文件

头文件是扩展名为 .h 的文件,其中包含要在多个源文件之间共享的C函数声明和宏定义.有两种类型的头文件:程序员编写的文件和编译器附带的文件.

您通过将其包含在C中请求在程序中使用头文件预处理指令 #include ,就像你已经看到包含 stdio.h 头文件一样,它随你的编译器一起提供.

包括头文件等于复制头文件的内容,但我们不这样做,因为它容易出错,并且在源文件中复制头文件的内容不是一个好主意,特别是如果我们有程序中的多个源文件.

C或C ++程序中的一个简单实践是我们将所有常量,宏,系统范围的全局变量和函数原型保存在头文件中并包含该头文件只在需要的地方.

包含语法

使用预处理指令#包含用户和系统头文件包括的.它有以下两种形式 :

 
 #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()); 
}

一次性标题

如果头文件恰好包含两次,编译器将处理其内容两次,这将导致错误.防止这种情况的标准方法是将文件的整个实际内容包含在条件中,例如 :

#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

但随着它的增长,它变得乏味,而预处理器提供了使用宏作为标题名称的能力.这称为计算包括.您不必将标题名称作为 #include 的直接参数,而只需将宏名称放在那里去;

 
 #define SYSTEM_H"system_1.h"
 ... 
 #include SYSTEM_H

SYSTEM_H将被扩展,预处理器将查找system_1.h,好像 #include 最初是以这样的方式编写的. SYSTEM_H可以由Makefile使用-D选项定义.