C语言头文件路径的剖析

在一个软件项目中,如果需要在一个文件中包含另一个头文件时,一般有两种包含方式:
#include #include “module.h”如果你引用的头文件是标准库的头文件或官方路径下的头文件,一般使用尖括号 包含;如果你使用的头文件是自定义的或项目中的头文件,一般使用双引号 包含。头文件路径一般分为绝对路径和相对路径:绝对路径以根目录 / 或者windows下的每个盘符为路径起点;相对路径则是以程序文件当前的目录为起点。
#include ”/home/wit/code/xx.h” //linux下的绝对路径#include “f:/litao/code/xx.h //windows下的绝对路径#include ”../lcd/lcd.h” //相对路径,..表示当前目录的上一层目录#include ”./lcd.h” //相对路径,.表示当前目录#include ”lcd.h” //相对路径,当前文件所在的目录编译器在编译过程中会按照这些路径信息到指定的位置去查找头文件,然后通过预处理器作展开处理。在查找头文件的过程中,编译器会按照默认的搜索顺序到不同的路径下面去搜索,以 #include 为例,当我们使用尖括号 包含一个头文件时,头文件的搜索顺序为:
• 通过gcc参数 gcc-i 指定的目录(注:大写的 i)
• 通过环境变量 cincludepath 指定的目录
• gcc 的内定目录
• 搜索规则:当不同目录下存在相同的头文件时,先搜到那个使用哪个,搜索停止
当我们使用双引号 “” 来包含头文件路径时,编译器会首先到项目当前目录去搜索需要的头文件,在当前项目目录下面搜不到,再到其他指定的路径下面去搜索:
• 项目当前目录
• 通过 gcc 参数 gcc-i 指定的目录
• 通过环境变量 cincludepath 指定的目录
• gcc 的内定目录
• 搜索规则:当不同目录下存在相同的头文件时,先搜到那个使用哪个
在编译程序时,如果我们的头文件没有放到官方路径下面,我们可以通过 gcc -i 来指定头文件路径,编译器在编译程序时,就会到用户指定的路径目录下面去搜索该头文件。如果你不想通过这种方式,也可以通过设置环境变量来添加头文件的搜索路径。在 linux 环境下我们经常使用的环境变量有:
• path: 可执行程序的搜索路径
• c_include_path: c语言头文件搜索路径
• cplus_include_path: c++头文件搜索路径
• library_path: 库搜索路径
我们可以在一个环境变量内设置多个头文件搜索路径,各个路径之间使用冒号:隔开。如果你想每次系统开机,这个环境变量设置的路径信息都生效,可以将下面的 export 命令添加到系统的启动脚本::~/.bashrc文件中。
export c_include_path=$c_include_path:/path1:/path2除此之外,我们也可以将头文件添加到 gcc 内定的官方目录下面。编译器在上面指定的各种路径下面找不到对应的头文件时,最后会到 gcc 的内定目录下面去寻找。这些目录是 gcc 在安装时,通过 --prefex 参数指定安装路径时指定的,常见的内定目录有:
/usr/include/usr/local/include/usr/include/i386-linux-gnu/usr/lib/gcc/i686-linux-gnu/5/include/usr/lib/gcc/i686-linux-gnu/5/include-fixed/usr/lib/gcc-cross/arm-linux-gnueabi/5/include接下来我们做一个实验,看看实际情况跟上面说得是否一致:我们创建多个头文件module.h,分别将其放置到不同的目录下,在main()函数中分别#include这个头文件,观察程序的运行结果。
# mkdir /home/test# cd test# touch main.c module.hmain.c源文件的代码如下:
// main.c#include #include module.hint main (void){ printf(num = %d\\m, num); return 0;}//#module.h#define num 10在module.h中分别定义一个宏:num,然后将这个头文件拷贝到不同的目录下:
将num定义为10,拷贝到/home/test目录下将num定义为20,将module.h拷贝到/usr/include目录下将num定义为30,将module.h拷贝到//usr实验过程:
只保留/home/test/module.h头文件,main.c中使用#include ,观察程序的编译运行结果只保留/home/test/module.h头文件,main.c中使用#include module.h,观察程序的编译运行结果将module.h拷贝到/home/test、/usr/include目录下,分别定义为10、20,观察程序的运行结果将module.h拷贝到/usr/include目录下,main.c中使用#include module.h,观察程序的运行结果这一轮实验做下来,相信大家已经对头文件的搜索路径、搜索顺序就有了一个清晰的认识了。本文摘自《嵌入式c语言自我修养》9.4.6节:

开关模式电源电路板布局的黄金法则
嵌入式毫米波雷达解决方案将提高汽车主动安全性
使用毫米波传感器检测移动车内人员乘坐情况
JEET耳机:高通CSR8645芯片+APT-X专利技术
曲轴传感器_曲轴传感器类型_曲轴传感器在汽车上的作用
C语言头文件路径的剖析
3D三维尺寸测量设备介绍
5g毫米波技术有什么好处
制动防抱死控制系统(ABS)是什么意思
材料基因组方法如何促进锂电池材料研发
苹果或将在芯片制造一场革命让iPhone更强
一文解析索尼微单旗舰Alpha 1的规格及性能
Google透露了新的Wear OS更新
松下无反GF10怎么样 值不值得买
VoNR上行RTP质差的问题处理化
PCB设计中线宽、线距设置规则
【每周精选】全志系列开源项目分享(原理图+PCB+源码)
锤子M1虽然性能强悍,但锤子T2才是最漂亮的
欧司朗计划扩大马来的业务组合 深耕车用照明领域
realmeQ正式发布 售价998元起