C

C 知识量:16 - 74 - 317

16.3 #include><

包含文件- 16.3.1 -

#include指令用于在编译前包含文件,当预处理器遇到#include时,就会尝试查找其后的文件名,并将该文件内容包含到#include指令所在的位置。

#include指令有两种形式:

  • 文件名在尖括号中,例如:#include <stdio.h> 

  • 文件名在双引号中,例如:#include "mystuff.h"

它们的区别在于:尖括号告诉预处理器在标准系统目录中查找该文件;双引号则告诉预处理器首先在当前目录(或文件名中指定的其他目录)中查找该文件,如果未找到再查找标准系统目录。

#include指令常用于包含头文件,C语言中通常使用.h后缀表示头文件,其中包含需要放在程序顶部的信息。

创建头文件- 16.3.2 -

下面是一个头文件(name_set.h)示例,用于创建一个存储人名的结构和一些使用该结构的函数。

#include <string.h>
#define SIZE 20

// 结构声明

struct name_set {
    char first[SIZE];
    char last[SIZE];
};
// 类型定义
typedef struct name_set names;
// 函数原型
void input_names(names *);
void show_names(const names *);

注意:以上内容是编译器在创建可执行代码时所需的信息,而不是可执行代码,可执行代码通常在源代码文件中。以下是可执行代码部分(name_exe.c):

#include <stdio.h>
#include "name_set.h" // 包含头文件  

// 函数定义
void input_names(names * pn) {
    //...省略内容
}

void show_names(const names * pn) {
    //...省略内容
}

在name_exe.c中,因为包含了name_set.h头文件,所以编译器知道names类型。如果在main()函数中使用以上代码,必须首先包含name_set.h头文件,然后编译和链接name_exe.c源代码和main()函数所在的主文件源代码。其中,声明和指令放在name_set.h头文件中,函数定义放在name_exe.c源代码文件中。

使用头文件- 16.3.3 -

头文件的基本信息通常包含以下内容:

  • 明示常量。例如,stdio.h中定义的EOF、NULL。

  • 宏函数。例如,getc(stdin)通常用getchar()定义,而getc()经常用于定义较复杂的宏。

  • 函数声明。例如,string.h头文件包含了字符串函数系列的函数声明。在ANSI C和后面的标准中,函数声明都是函数原型形式。

  • 结构模版定义。标准I/O函数使用FILE结构,该结构中包含了文件和与文件缓冲区相关的信息。FILE结构在头文件stdio.h中。

  • 类型定义。标准I/O函数使用指向FILE的指针作为参数。通常,stdio.h用#define或typedef把FILE定义为指向结构的指针。类似地,size_t和time_t类型也定义在头文件中。

可以在程序中使用自己开发的标准头文件。例如:可以使用头文件声明外部变量供其他文件共享,只要变量声明的类型一致,可以在一个文件中同时使用定义式声明和引用式声明来实现。此外,还可以使用具有文件作用域、内部链接和const限定符的变量或数组。const防止值被意外修改,static意味着每个包含该头文件的文件都获得一份副本,因此,也就不需要在一个文件中进行定义式声明,而在其他文件中进行引用式声明。