📜  C-头文件

📅  最后修改于: 2020-12-19 05:32:39             🧑  作者: Mango


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

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

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

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

包含语法

使用预处理指令#include包括用户和系统头文件。它具有以下两种形式-

#include 

该表格用于系统头文件。它在系统目录的标准列表中搜索名为“ 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最初是用这种方式编写的一样。您的Makefile可以使用-D选项定义SYSTEM_H。