C语言的include语句用来包含头文件,所谓包含,就是将头文件中的内容,插入到include语句所在位置,这是C语言编译过程预处理要做的事情,很简单,一定不神秘。include有两个格式,一种是尖括号<>,一种是双引号””。
#include <>
格式:引用标准库头文件,编译器从标准库目录开始搜索
尖括号表示只在系统默认目录或者括号内的路径查找,通常用于包含系统中自带的头文件;
尖括号:在包含文件目录中去查找(包含目录是由用户在设置环境时设置的),而不在源文件目录去查找;
#incluce “”
格式:引用非标准库的头文件,编译器从用户的工作目录开始搜索
双引号表示先在程序源文件所在目录查找,如果未找到则去系统默认目录查找,通常用于包含程序作者编写的头文件;
双引号:首先在当前的源文件目录中查找,若未找到才到包含目录中去查找。
补充一个常识:
C语言中以#(发音hash)开头的语句,都叫做预编译指令。比如:#include,#define,#if等。
2019-03-15:
由给定的 C 语言实现版本决定 #include 命令所指定文件的搜索路径。同时,也由实现版本决定文件名是否区分大小写。对于命令中使用尖括号指定的文件(),预处理器通常会在特定的系统路径下搜索,例如,在 Unix 系统中,会搜索路径 /usr/local/include 与 /usr/include。
对于命令中用双引号指定的文件(“文件名”),预处理器通常首先在当前目录下寻找,也就是包含该程序其他源文件的目录。如果在当前目录下没有找到,那么预处理器也会搜索系统的 include 路径。文件名中可以包含路径。但如果文件名中包含了路径,则预处理器只会到该目录下寻找。
你也可以通过使用编译器命令行选项,或在环境变量(该变量通常称为 INCLUDE)中加入搜索路径,为 #include 命令指定自己的搜索路径。具体的做法请参考采用的编译器的说明文档。
最后强调一下,include就是将文件内容在置顶位置展开做预编译,使用.h文件后缀是一个约定俗成的做法,在网上看到有人直接include一个.c文件:
include一个.c文件
只需要关注include的.c文件,两句extern是有问题的,这里其实更本不需要这两句话。