文章目录
-
前言
-
一、include<***.h>与include"***.h"的区别
-
二、C/C++中 IncudePaths中的目录的说明
-
三、头文件加载的方式(<***.h>与"***.h"通用)
-
1.通过当前源程序.c当前目录寻找***.h
-
2.通过C/C++中 IncudePaths中的目录逐条寻找***.h
-
总结
前言
在使用Keil MDK开发stm32或者C51嵌入式应用时,经常涉及到工程模块化的应用,其中头文件的路径及包含问题是一个重要的细节,涉及工程架构的清晰及编译的快慢。
首先在windows环境下:
“ .\ ”表示当前目录
“ ..\ ”表示当前目录的上1级目录
“ ..\ ..\ ”表示当前目录的上2级目录
依次类推
一、include<***.h>与include"***.h"的区别
#include "***.h" 表示用户自定义目录, 编译器查找顺序:【当前.c目录】->【 C/C++中 IncudePaths中的目录】->【Keil系统目录,例如D:\Keil_v5\ARM\ARMCC\include】
#include <***.h> 表示直接从系统目录查找, 编译器查找顺序:【Keil系统目录,例如D:\Keil_v5\ARM\ARMCC\include】->【当前.c目录】->【 C/C++中 IncudePaths中的目录】
二、C/C++中 IncudePaths中的目录的说明
IncudePaths中的所有目录都是以MDK工程(***.uvprojx)所在目录的相对目录
三、头文件加载的方式(<***.h>与"***.h"通用)
1.通过当前源程序.c当前目录寻找***.h
-
当在.c文件中使用include"ccc.h"
//ccc.h存在于:当前.c目录(即.c与ccc.h处于同一目录里面)
-
当在.c文件中使用include"bbb\ccc.h"
//ccc.h存在于:当前.c目录下面bbb文件夹里面
-
当在.c文件中使用include"aaa\bbb\ccc.h"
//ccc.h存在于:当前.c目录下面aaa文件夹里面的bbb文件夹里面
-
当在.c文件中使用include"..\ccc.h"
//ccc.h存在于:当前.c目录上1级目录里面
-
当在.c文件中使用include"..\..\ccc.h"
//ccc.h存在于:当前.c目录上2级目录里面
-
当在.c文件中使用include"..\..\bbb\ccc.h"
//ccc.h存在于:当前.c目录上2级目录里面bbb文件夹里面
-
当在.c文件中使用include"..\..\..\aaa\bbb\ccc.h"
//ccc.h存在于:当前.c目录上3级目录里面aaa文件夹里面的bbb文件夹里面
无论那种方式去寻找ccc.h时,首先都是以.c文件所在目录寻找ccc.h的相对路径
当编译器使用.c当前目录找不到ccc.h时,编译器开始自上而下使用C/C++中 IncudePaths中目录逐条溯源寻找
2.通过C/C++中 IncudePaths中的目录逐条寻找***.h
例如C/C++中 IncudePaths中的目录如下:(都是***.uvprojx所在目录的相对目录)
【A目录:优先级1】..\..\Libraries\CMSIS\Include
【B目录:优先级2】..\..\Libraries\STM32F4xx_HAL_Driver\Inc
【C目录:优先级3】..\..\Libraries\STM32F4xx_HAL_Driver\Src\Legacy
【D目录:优先级4】..\..\Libraries\CMSIS\Device\ST\STM32F4xx\Include
【E目录:优先级5】..\..\..\V5-002
-
当在.c文件中使用include"ccc.h"
//ccc.h存在于:编译器首先去A目录里面寻找,找不到,编译器再去B目录里面寻找,找不到,编译器再去C目录里面寻找,找不到,编译器再去D目录里面寻找,找不到,编译器再去E目录里面寻找,找不到,那就真是【error: #5: cannot open source input file "ccc.h": No such file or directory】
-
当在.c文件中使用include"bbb\ccc.h"
//ccc.h存在于:编译器首先去A目录bbb文件夹里面寻找,找不到,编译器再去B目录bbb文件夹里面寻找,找不到,编译器再去C目录bbb文件夹里面寻找,找不到,编译器再去D目录bbb文件夹里面寻找,找不到,编译器再去E目录bbb文件夹里面寻找,找不到,那就真是【error: #5: cannot open source input file "bbb\ccc.h": No such file or directory】
-
当在.c文件中使用include"aaa\bbb\ccc.h"
//ccc.h存在于:编译器首先去A目录aaa文件夹里面bbb文件夹里面寻找,A目录aaa文件夹里面bbb文件夹里面找不到,编译器再去B目录aaa文件夹里面bbb文件夹里面寻找,找不到,编译器再去C目录aaa文件夹里面bbb文件夹里面寻找,找不到,编译器再去D目录aaa文件夹里面bbb文件夹里面寻找,找不到,编译器再去E目录aaa文件夹里面bbb文件夹里面寻找,找不到,那就真是【error: #5: cannot open source input file "aaa\bbb\ccc.h": No such file or directory】
-
当在.c文件中使用include"..\ccc.h"
//ccc.h存在于:编译器首先去A目录上1级里面寻找,找不到,编译器再去B目录上1级里面寻找,找不到,编译器再去C目录上1级里面寻找,找不到,编译器再去D目录上1级里面寻找,找不到,编译器再去E目录上1级里面寻找,找不到,那就真是【error: #5: cannot open source input file "..\ccc.h": No such file or directory】
-
当在.c文件中使用include"..\..\ccc.h"
//ccc.h存在于:编译器首先去A目录上2级里面寻找,找不到,编译器再去B目录上2级里面寻找,找不到,编译器再去C目录上2级里面寻找,找不到,编译器再去D目录上2级里面寻找,找不到,编译器再去E目录上2级里面寻找,找不到,那就真是【error: #5: cannot open source input file "..\..\ccc.h": No such file or directory】
-
当在.c文件中使用include"..\..\bbb\ccc.h"
//ccc.h存在于:编译器首先去A目录上2级里面bbb文件夹寻找,找不到,编译器再去B目录上2级里面bbb文件夹寻找,找不到,编译器再去C目录上2级里面bbb文件夹寻找,找不到,编译器再去D目录上2级里面bbb文件夹寻找,找不到,编译器再去E目录上2级里面bbb文件夹寻找,找不到,那就真是【error: #5: cannot open source input file "..\..\bbb\ccc.h": No such file or directory】
-
当在.c文件中使用include"..\..\..\aaa\bbb\ccc.h"
//ccc.h存在于:编译器首先去A目录上3级里面aaa文件夹里面bbb文件夹寻找,找不到,编译器再去B目录上3级里面aaa文件夹里面bbb文件夹寻找,找不到,编译器再去C目录上3级里面aaa文件夹里面bbb文件夹寻找,找不到,编译器再去D目录上3级里面aaa文件夹里面bbb文件夹寻找,找不到,编译器再去E目录上3级里面aaa文件夹里面bbb文件夹寻找,找不到,,找不到,那就真是【error: #5: cannot open source input file "..\..\..\aaa\bbb\ccc.h": No such file or directory】
无论那种方式去寻找ccc.h时,首先都是***.uvprojx所在目录的相对目录
总结
Keil MDK中头文件包含的方式很灵活:
-
直接当前目录寻找
-
相对当前目录寻找【溯源+拼接】
-
直接IncudePaths目录寻找
-
相对IncudePaths目录寻找【溯源+拼接】
-
直接Keil MDK系统目录寻找,例如D:\Keil_v5\ARM\ARMCC\include