0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言头文件路径的剖析

汽车电子技术 来源:宅学部落 作者: 王利涛 2023-02-17 09:44 次阅读

在一个软件项目中,如果需要在一个文件中包含另一个头文件时,一般有两种包含方式:

#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.h

main.c源文件的代码如下:

// main.c
#include 
#include "module.h"
int 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节:

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    18275

    浏览量

    222157
  • 文件
    +关注

    关注

    1

    文章

    540

    浏览量

    24402
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48614
收藏 人收藏

    评论

    相关推荐

    你应该搞懂的 C 语言头文件路径问题

    前段时间在写 Linux 专栏的过程中,忽然想到一个问题 :C语言头文件路径,因为在GCC环境下面,可以很直观的了解到程序对头文件的查找位置,但是对于使用集成开发环境 KEIL 或者
    的头像 发表于 06-14 11:41 3173次阅读
    你应该搞懂的 C <b class='flag-5'>语言</b><b class='flag-5'>头文件</b><b class='flag-5'>路径</b>问题

    C语言必备知识头文件包含

    头文件在C语言中是非常重要的组成部分。
    的头像 发表于 12-01 18:20 782次阅读

    如何编写自己的C语言头文件

     一些初学C语言的人,不知道头文件(*.h文件)原来还可以自己写的。只知道调用系统库 函数时,要使用#include语句将某些头文件
    发表于 03-11 22:19

    C语言深度剖析

    C语言深度剖析——一本关于C语言学习的教程,里面包含C语言
    发表于 08-14 11:36

    c语言深度剖析

    c语言深度剖析
    发表于 04-02 09:12

    亲们,Multisim中C语言头文件有哪些啊

    Multisim中C语言头文件有哪些啊,之前编写文件用了一个,在Multisim中对应的有哪些
    发表于 05-15 17:31

    【资料分享】C语言深度剖析

    C语言深度剖析
    发表于 10-16 15:16

    C语言深度剖析

    C语言深度剖析
    发表于 08-25 09:08

    C语言深度剖析

    C语言深度剖析[完整版].pdfC语言深度剖析[完整版].pdf (919.58 KB )
    发表于 03-19 05:11

    如何添加头文件路径

    请问如何添加头文件路径?自定义的类型和宏出现了各种报错,诸如:"#" not expected hereexpected a declarationinvalid
    发表于 10-23 07:59

    STM32 单片机C语言课程5-C语言预处理深入剖析2

    大家上午好!今天为大家讲解C语言预处理深入剖析,请持续关注,会持续进行更新!前期回顾:STM32 单片机C语言课程4-
    发表于 09-13 11:40

    C语言头文件是做什么的

    c语言程序代码文件扩展名只能是.c或者.h,换句话说,c语言程序代码只能在扩展名为.c或者.h的文件中编写。我们把.h文件称为
    的头像 发表于 02-13 15:29 9011次阅读

    C语言头文件组织作用与包含原则详解

    说明 本文假定读者已具备基本的C编译知识。 如非特殊说明,文中源文件指 * .c文件头文件指 *.h文件,引用指包含头文件。 一、
    的头像 发表于 11-12 17:49 2487次阅读

    C语言头文件组织与包含原则

    说明本文假定读者已具备基本的C编译知识。 如非特殊说明,文中“源文件”指 * .c文件,“头文件”指 *.h文件,“引用”指包含头文件
    的头像 发表于 11-14 11:31 3199次阅读

    C 语言头文件路径位置问题

    前言 前段时间在写 Linux 专栏的过程中,忽然想到一个问题 :C语言头文件路径,因为在GCC环境下面,可以很直观的了解到程序对头文件的查找位置,但是对于使用集成开发环境 KEIL
    的头像 发表于 06-22 10:05 4137次阅读
    C <b class='flag-5'>语言</b>的<b class='flag-5'>头文件</b><b class='flag-5'>路径</b>位置问题