(参考工程详见https://download.csdn.net/download/tianzhijiaoxin/87464281


前言

在使用Keil MDK开发stm32或者C51嵌入式应用时,经常涉及到工程模块化的应用,其中头文件的路径及包含问题是一个重要的细节,涉及工程架构的清晰及编译的快慢。

首先在windows环境下:

“ .\ ”表示当前目录

“ ..\ ”表示当前目录的上1级目录

“ ..\ ..\ ”表示当前目录的上2级目录

依次类推

(参考工程详见https://download.csdn.net/download/tianzhijiaoxin/87464281


一、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中头文件包含的方式很灵活:

  1. 直接当前目录寻找
  2. 相对当前目录寻找【溯源+拼接】
  3. 直接IncudePaths目录寻找
  4. 相对IncudePaths目录寻找【溯源+拼接】
  5. 直接Keil MDK系统目录寻找,例如D:\Keil_v5\ARM\ARMCC\include

(参考工程详见https://download.csdn.net/download/tianzhijiaoxin/87464281

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐