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

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

3天内不再提示

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

矜辰所致 来源:矜辰所致 作者:矜辰所致 2023-06-14 11:41 次阅读
聊聊 C 语言项目的系统路径位置,绝对路径与相对路径,正斜杠 `/`与 反斜杠`\\` 使用说明   ......  by 矜辰所致

前言

前段时间在写 Linux 专栏的过程中,忽然想到一个问题 :C语言的头文件路径,因为在GCC环境下面,可以很直观的了解到程序对头文件的查找位置,但是对于使用集成开发环境 KEIL 或者 IAR 的朋友们来说,一些系统的库文件路径根本就不知道在什么地方。

所以本文我们就来聊一下 C 语言的头文件路径相关的问题 ,包括系统路径位置,绝对路径与相对路径,正斜杠 / 与 反斜杠 \\ 使用说明等。

我是矜辰所致,全网同名,尽量用心写好每一系列文章,不浮夸,不将就,认真对待学知识的我们,矜辰所致,金石为开!

一、C语言中的头文件引用

我们都知道,在我们 C 编程的时候,我们头文件的引用使用的是 #include <> 或者 #include "",比如:

在这里插入图片描述

而且大家应该都知道:

  • include 使用双引号" ",编译器首先在当前目录下查找头文件,如果没有找到,再到系统目录下查找。

  • include 使用尖括号< >,编译器会到系统目录下查找头文件;

    .

这里额外提一句,因为 使用双引号" "如果在当前目录找不到头文件,最终还是会去系统路径下寻找,所以头文件包含,完全可以都使用双引号" " ,至于实际中还是有很多使用 < > 和 " " 混搭,那是因为在确定是引用系统路径的头文件的时候,使用 < > 相对来说效率高那么一点点,省去了在当前目录下面寻找的那一点时间。

对于使用双引号" " 的当前目录下查找,大家应该都知道,就是与引用头文件的.c 文件相同的目录下,比如上面是 main.c 文件引用的,就是首先在与 main.c 相同的目录中去查找。

那么对于 < > 从系统路径中搜索,这个系统目录到底在哪里呢?

二、KEIL 中的头文件路径

我们先从我们熟悉的 IDE 入手,用 KEIL 来说明一下。

2.1 IncudePaths 指定的路径

在我们使用 KEIL 做项目的时候,都需要一个IncudePaths ,就是填写头文件路径,如下图所示:

KEIL4 上是51单片机的项目:

在这里插入图片描述

KEIL5 上是 STM32 的项目:

在这里插入图片描述

为了工程结构框架,我们不可能把文件放在同一个目录下面,所以需要进行额外的指定头文件路径,这里只要用过 KEIL 的朋友应该都能明白。

对于 include 使用双引号" "的头文件,首先会在引用头文件的.c 文件相同的目录下去查找,如果查找不到,会在上面 IncudePaths 设置中所有设置过的目录中去查找,这一点我们不多赘述。

绝对路径和相对路径

这里我们额外说明一个问题,绝对路径与相对路径。

在上面的示例图中,我们可以看到,IncudePaths 里面所添加的路径,都是 ../开头的,这种表示方式就是相对路径。

使用相对路径的好处是即便整个工程移动了位置,也无需修改什么设置,因为工程文件的相对位置没有改变。

简单复习下相对路径的表示:

./ : 表示当前路径

../:表示上一级目录

绝对路径就比较简单了,绝对路径就是直接从根部(盘符)开始表示的路径,在 Windows 中,就是 C盘,D盘,这些,在 Linux 中,没有盘符的说法,根部就是 / ,比如下面两个都是绝对路径的表示:

C:\\Keil\\C51

/home/qzh/linux

正斜杠 / 与 反斜杠 \\ 与双斜杠

正好提到文件路径,顺带把斜杠的问题也说一下,在上面示意图中,我们可以看到,既有正斜杠,又有反斜杠:

在这里插入图片描述

对于路径的表示 ( 声明,这里只是针对文件路径!路径! ):

  • Linux 中都使用正斜杠 /

    .

    Linux下好理解,只能用正斜杠 / :/home/qzh/linux

    .

  • 在Windows 中,稍微复杂一点

    .

    在Windows 中常用 反斜杠 \\ ,比如我们随便看一个系统显示的路径都是反斜杠 \\

    在这里插入图片描述

    .

    实际上,Windows 除了在一些特定的场合必须用反斜杠 \\,在引用路径的时候斜杠/和反斜杠\\可以互用的。

比如下面两种方式的引用都是可以的:

#include "..\\led\\led.h" 

#include "../led/led.h"

为了可移植性,引入头文件时建议使用正斜杠/#include "../led/led.h"

不仅如此,在Windows下引用文件路径的时候,正反双斜杠//\\\\ 与斜杠 / 、反斜杠\\可以互用的,如下图所示:

在这里插入图片描述

双斜杠

在写一些脚本或者程序的时候(上面是引用路径的情况,这里额外提一下程序中的情况,程序中!程序中!),我们也经常看到双斜杠,比如:

C:\\\\Keil\\\\C51

这种路径表示是为什么呢?

因为在大多编译器中,\\是一个转义字符,例如\\n,\\r ,所以如果使用反斜杠 \\,会使得路径出问题,所以会写成 \\\\

当然正如我们上面说过的,我们在程序中可以写成 C:\\\\Keil\\\\C51 ,当然也可以使用 斜杠 / 写成C:/Keil/C51

2.2 include < > 搜索的系统路径

额外提了那么多,回到我们的正题,来说说在 KEIL 中的 #include < > 的查找路径。

比如我们在本文第一张示意图上有一个应用#include ,我们明确的告诉编译器这个需要从系统路径中去查找,这个 KEIL 所谓的系统路径在什么地方呢?

这里我们也没什么好分析的,直接告诉大家答案:

第一个基于51平台的,使用的 51 的编译器, #include < > 的查找路径为“KEIL的安装目录”:\\Keil\\C51\\INC ,比如博主的KEIL安装在C盘,这个路径就是C:\\Keil\\C51\\INC

在这里插入图片描述

当然,我们可以简单的做个试验确认一下,我们可以在 KEIL 中先打开 这个头文件:

在这里插入图片描述

然后我们打开C:\\Keil\\C51\\INC 目录下的 MATH.h 文件,进行简单的修改,然后看一下是否是同一个文件,如下图:

在这里插入图片描述

那么对于 KEIL5 中的 STM32 中如果使用 #include < > ,那么这个的查找路径又是怎样的呢?

STM32 在 KEIL中使用的编译器为 ARMCC,这个系统路径的位置为:“KEIL的安装目录”:\\Keil_v5\\ARM\\ARMCC\\include ,比如博主的KEIL安装在C盘,这个路径就是C:\\Keil_v5\\ARM\\ARMCC\\include

这一点我就不去确定了,大家可以自己添加一个库函数头文件,然后自己根据上文的方式测试一下便知。

三、Linux 中的头文件路径

上面介绍了 Windows 下的 KEIL 环境中的头文件系统路径,那么我们来看看 Linux 中的路径又是在哪里,我们知道在 Linux 中 C 语言的编译器是 GCC 编译器,在文章开头的前言我就写过了, 使用 GCC 编译器可以很直观的查看到 #include < > 尖括号包含的头文件的查找路径,下面我们来看一下。

在这里插入图片描述

写一个简单的程序,里面用到了 这个头文件,我们可以使用编译选项 -v 来打印出详细的编译步骤:

在这里插入图片描述

如上图所示,在 Linux 是不是很直观,没什么需要特别说明的。

那么我们再换另外一种编译器,其实还是 GCC ,只不过是 ARMGCC,我们也来看一看:

在这里插入图片描述

可以看到,同样的可以很直观的看到尖括号包含的头文件的搜索位置,当然,因为编译器的更换,他们搜索的位置也改变了。

最后简单总结一下,使用 #include < > 所包含的头文件,其查找路径和使用的编译器有关,编译器都会自带常用的库文件,在 GCC 环境下面,使用 -v 选项就会自动打印出查找位置,使用 IDE 环境根据 IDE 使用的编译器不同存放在对应的目录文件下面,一般来说都可以在 IDE 安装目录中可以找到。

结语

本文我们针对 C 语言头文件路径问题进行了讲解,举例说明了 Windows 下的 IDE 环境中 和 Linux 下GCC 环境中的C语言的 头文件查找路径。

文中还对引出的绝对路径与相对路径,还有路径引用时候的 正斜杠 / 与 反斜杠 \\ 与双斜杠 进行了说明。

希望大家以后在遇到头文件路径问题的时候,能够知道如何去查找问题,解决问题!

好了,本文就到这里,谢谢大家!

审核编辑:汤梓红

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

    关注

    87

    文章

    11191

    浏览量

    208622
  • WINDOWS
    +关注

    关注

    3

    文章

    3515

    浏览量

    88275
  • C语言
    +关注

    关注

    180

    文章

    7588

    浏览量

    135734
  • 头文件
    +关注

    关注

    0

    文章

    24

    浏览量

    9835
收藏 人收藏

    评论

    相关推荐

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

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

    FX3工程导入后头文件找不到是为什么?如何添加头文件路径

    在网上参考别人的工程项目,但是载入进去之后发现它的头文件都找不到,应该如何添加头文件路径
    发表于 05-27 07:53

    如何添加头文件路径

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

    一文搞懂头文件的用法和规则

    提到头文件,大家肯定不陌生。在编写模块的时候,一般有一个.c就会有一个.h,如下图:在.c中需要使用其他模块的变量和函数时,需要先引用头文件。比如:那么大家真的完全了解
    发表于 06-20 15:41

    C/C++头文件大全

    C/C++头文件一览,一本很好的工具速查手册
    发表于 11-10 17:45 0次下载

    单片机C语言头文件

    介绍有关于单片机C51编程时候有关头文件的相关知识,自己整理,欢迎指正!
    发表于 12-10 15:56 12次下载

    如何在C++代码中使用C头文件

    12.3 在C target=_blank style=cursor:pointer;color:#D05C38;text-decoration:underline;》C++中使用C
    发表于 10-19 09:24 3次下载

    C语言头文件是做什么的

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

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

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

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

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

    C语言中头文件包含里的那些事

    很多事不深入以为自己懂了,但真正用到项目上,才发现了问题。曾以为自己写C语言已经轻车熟路了,特别是对软件文件的工程管理上,因为心里对自己的代码编写风格还是有自信的。(毕竟刚毕业时老大对我最初的训练
    的头像 发表于 03-25 13:57 2352次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中头文件</b>包含里的那些事

    单片机-头文件

    reg52.h头文件的作用在代码中引用头文件,其实际意义是将头文件中的所用内容都放到引用头文件的地方下面是reg52.h头文件的内容:/*-
    发表于 11-23 17:21 17次下载
    单片机-<b class='flag-5'>头文件</b>

    C语言头文件路径的剖析

    编译器在编译过程中会按照这些路径信息到指定的位置去查找头文件,然后通过预处理器作展开处理。在查找头文件的过程中,编译器会按照默认的搜索顺序到不同的路径下面去搜索
    的头像 发表于 02-17 09:44 1776次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>头文件</b><b class='flag-5'>路径</b>的剖析

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

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

    可重复头文件的固定结构

    年轻人,可曾记得,在修习C语言的时候,见过这样的字句:在创建头文件的时候,一定要加入保护宏。
    的头像 发表于 08-29 10:23 272次阅读
    可重复<b class='flag-5'>头文件</b>的固定结构