头文件是扩展名为 .h 的文件,包括了 C 函数声明和宏界说,被多个源文件中引证共享。有两种类型的头文件:程序员编写的头文件和编译器自带的头文件。

在程序中要运用头文件,需求运用 C 预处理指令 #include 来引证它。前面咱们现已看过 stdio.h 头文件,它是编译器自带的头文件。

引证头文件相当于仿制头文件的内容,可是咱们不会直接在源文件中仿制头文件的内容,因为这么做很容易犯错,特别在程序是由多个源文件组成的时分。

A simple practice in 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 ());
}

编译器会看到如下的代码信息:

int x;
char *test (void);
int main (void)
{
   puts (test ());
}

只引证一次头文件

假如一个头文件被引证两次,编译器会处理两次头文件的内容,这将产生过错。为了防止这种情况,标准的做法是把文件的整个内容放在条件编译语句中,如下:

#ifndef HEADER_FILE
#define HEADER_FILE
the entire header file file
#endif

这种结构就是通常所说的包装器 #ifndef。当再次引证头文件时,条件为假,因为 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 可经过 -D 选项被您的 Makefile 界说。

在有多个 .h 文件和多个 .c 文件的时分,往往咱们会用一个 global.h 的头文件来包括一切的 .h 文件,然后在除 global.h 文件外的头文件中 包括 global.h 就能够完成一切头文件的包括,一起不会乱。方便在各个文件里面调用其他文件的函数或者变量。

#ifndef _GLOBAL_H
#define _GLOBAL_H
#include <fstream>
#include <iostream>
#include <math.h>
#include <Config.h>

C 语言中 include <> 与include “” 的区别?

#include < > 引证的是编译器的类库路径里面的头文件。

#include ” ” 引证的是你程序目录的相对路径中的头文件,假如在程序目录没有找到引证的头文件则到编译器的类库路径的目录下找该头文件。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。