前言
作者在刚开始学C语言的时候,都是用的< >去引用头文件,但在学习STM32的时候发现,程序中大量使用" "去引用双引号。
那么二者有什么区别呢?
无论使用哪种方式,头文件的目的都是为了引用你需要的文件供你编程使用,那么这里就有一个很重要的问题:程序怎么知道你的头文件在哪?
#include <xxx.h>
当使用<>来包含头文件时,编译器直接在系统的标准库路径中查找头文件,不会在当前源文件所在目录中查找。这种方式主要用于标准库的头文件,如stdio.h、stdlib.h等。
以DEV C++为例,点击工具->编译选项->目录,可以看到这就是编译器的默认的系统标准库路径。
#include "xxx.h"
当使用双引号来包含头文件时,编译器首先会在当前源文件所在的目录中查找指定的头文件。如果找不到,编译器会按照系统设置的标准路径去查找。这种方式通常用于项目内部的头文件,即用户自定义的头文件。
假设你的C语言文件(main.c)是在D盘的project文件夹中,同时你自定义了一个头文件myheader.h,放在C语言文件的同目录中的include文件夹中,结构如图:
D/
└──project/├── main.c└── include/└── myheader.h
你需要引用myheader.h,可以这样写:
#include "include/myheader.h"
编译器从当前源文件所在目录既main.c所在目录开始寻找include文件夹下的myheader.h
< >和" "主要区别
- 查询头文件的起始位置不一样,<>从系统目录中查找;""从源文件目录中开始查找
- 查询范围不一样,<>只查系统目录;""查完源文件目录后如果没找到目标文件,就会查一遍系统目录
< > 和" "的兼容问题
< >搜索路径查找头文件
我们知道的是" "可以在里面写路径,去查找源文件目录下的自定义头文件;但很少人知道的是,< >也可以写入路径,去查找系统目录下头文件,但为什么不用呢?
因为<>会将系统目录下的内容全部扫描一遍,因此不需要写路径。
但在某些情况下,也可以在尖括号中指定路径来引用头文件。这通常取决于编译器的实现和配置。
-
编译器支持:某些编译器可能允许在尖括号中指定相对路径或绝对路径来引用头文件。然而,这并不是标准做法,且可能不具有可移植性。
-
项目配置:在大型项目中,可能会通过配置文件或编译选项来指定额外的头文件搜索路径。在这种情况下,即使使用尖括号,编译器也可能会在这些指定的路径中查找头文件。
-
示例:假设有一个自定义头文件
mycustomlib.h
位于项目的include/custom
目录下,并且该目录已经被添加到编译器的包含路径中。那么,可以使用尖括号来引用这个头文
#include <custom/mycustomlib.h>
【注意】这里最重要的是< >搜索路径,必须将目录添加到编译器包含的路径中才允许
" "查找系统库头文件
之前提到过," "会先查源文件目录,没找到头文件之后就会查系统库,因此" "是兼容< >的功能的,例如:
#include "stdio.h"
这是被允许的,也可以找到这个头文件,但相对< >而言就会慢一点
总结
无论是哪种方式,其根本目的还是为了找到相应的头文件,<>常用于系统库头文件的引用,""常用于自定义头文件,其本质区别在于搜索头文件的目录上。两者并非一成不变的,可以根据使用者的习惯灵活使用。