#include< file >编译程序会先到标准函数库中找文件
#include”file” 编译程序会先从当前目录中找文件
在C程序中包含文件有以下两种方法:
(1)用符号“<”和“>”将要包含的文件的文件名括起来。这种方法指示预处理程序到预定义的缺省路径下寻找文件。预定义的缺省路径通常是在INCLUDE环境变量中指定的,请看下例:
INCLUDE=C:\COMPILER\INCLUDE;S:\SOURCE\HEADERS;
对于上述INCLUDE环境变量,如果用#include语句包含文件,编译程序将首先到C:\COMPILER\INCLUDE目录下寻找文件;如果未找到,则到S:\SOURCE\HEADERS目录下继续寻找;如果还未找到,则到当前目录下继续寻找。(2)用双引号将要包含的文件的文件名括起来。这种方法指示预处理程序先到当前目录下寻找文件,再到预定义的缺省路径下寻找文件。
对于上例中的INCLUDE环境变量,如果用#include“file”语句包含文件,编译程序将首先到当前目录下寻找文件;如果未找到,则到C:\COMPILER\INCLUDE目录下继续寻找;如果还未找到,则到S:\SOURCE\HEADERS目录下继续寻找。
#include语句一般用来包含标准头文件(例如stdio.h或stdlib.h),因为这些头文件极少被修改,并且它们总是存放在编译程序的标准包含文件目录下。#include“file”语句一般用来包含非标准头文件,因为这些头文件一般存放在当前目录下,你可以经常修改它们,并且要求编译程序总是使用这些头文件的最新版本。
另外,需要注意的地方:
1、#include "..." 在编译器编译时,先在使用include的源文件所在目录找, 而不是编译器当前工作目录找
2、 #include <...> 所谓的"从系统目录找", 那么"系统目录"到底有哪些, 怎么看呢?
以gcc为例, 在命令行运行 echo | gcc -E -v -
bash-3.2$ echo | gcc -E -v -
* * *
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/i686-pc-linux-gnu/4.8.2/include
/usr/local/include
/usr/lib/gcc/i686-pc-linux-gnu/4.8.2/include-fixed
/usr/include
End of search list.
还可以通过-I参数把目录添加到系统目录中
bash-3.2$ echo | gcc -E -v -I. -
* * *
#include "..." search starts here:
#include <...> search starts here:
.
/usr/lib/gcc/i686-pc-linux-gnu/4.8.2/include
/usr/local/include
/usr/lib/gcc/i686-pc-linux-gnu/4.8.2/include-fixed
/usr/include
End of search list.
3、下面这种情形下( 注意: 1.c的 #include <hdr.h> ), 会包含那个hdr.h ?
bash-3.2$ tree
|-- sub
| |-- 1.c
| `-- hdr.h
`-- hdr.h
bash-3.2$ cat sub/1.c
#include <hdr.h>
bash-3.2$ gcc -c -I. sub/1.c
会包含最外层的hdr.h,也就是说#include <>在系统目录中找不到指定的头文件,下一步的搜索路径列表是基于编译器工作路径的.