C语言头文件路径相关问题总结说明

2023-11-10

聊聊系统路径位置,绝对路径与相对路径,正斜杠 `/` 与 反斜杠 `\` 使用说明   ......  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 <math.h>,我们明确的告诉编译器这个需要从系统路径中去查找,这个 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 < > 尖括号包含的头文件的查找路径,下面我们来看一下。

在这里插入图片描述

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

在这里插入图片描述

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

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

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

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

结语

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言头文件路径相关问题总结说明 的相关文章

  • 在多线程中使用tensorRT

    仅记录 转自https www coder work article 4985246 import pycuda autoinit Create CUDA context import pycuda driver as cuda Main
  • Ubuntu ssh连接access deny

    一 尝试了修改配置的方法 不能解决问题 1 修改ssh配置文件vim etc ssh sshd config 设置为允许root远程登录 2 找到PermitRootLogin prohibie password 修改为 PermitRoo
  • windows11 使用 wsl2 安装 archLinux

    windows11 使用 wsl2 安装 archLinux 下载 archLinux 下载 tar gz 文件 下载地址 https mirrors tuna tsinghua edu cn archlinux iso latest 启用
  • 编译ROCKSDB总结

    Rocksdb是挺好的一个东西 就是取得一个可用的库太麻烦 之前我是用的rocksdbsharp里面他有编译好windows 和 linux的库 兼 容性还挺好 ubuntu win10 直接跑没毛病 可惜他是去年build的了 我要用的c
  • C++ - 强引用和弱引用

    原来 我认为 为什么会有引用计数这样的技术 是为了内存自动回收和节省内存 但是读完下面的几节后 内存自动回收是一个原因 但是节省内存并不是真正的原因 真正的原因是有些对象如果被复制在现实中是不合事实的 为什么有引用计数 C 中存在两种语义
  • vite vue3 规范化与Git Hooks

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • 在Windows Server2016中安装SQL Server2016

    SQL Server2016安装硬 软件条件 点击打开链接 WinServer2016的安装参见 在虚拟机中安装Windows Server2016 1 SQL Server2016下载地址 1 SQL Server2016安装包 2016
  • SuperPunch - unity3D拳击小游戏项目源码

    SuperPunch是一个完整的项目 准备发布并且适合移动设备 它包含构建顶头拳击游戏的所有必要内容 特征 移动友好的纹理 分层的 包括 SVG 文件 包括 PNG文件 包括 C 脚本 包括文档 包括6架战斗机 包括战士动画 闲置 拳击 受

随机推荐

  • QChart入门教程-绘制正弦曲线

    1 创建界面 将widget作为容器进行绘图 并将widget提升为QChartView类 1 1 单击widget 右键中选择 提升 提升的类名称中填写 QChartView 会自动生成头文件名 选择 添加 将类和头文件添加进要提升的类中
  • ElasticSearch第十八讲 ES-Master节点职责和ES是如何做到数据实时性的

    Elasticsearch Master 节点的职责 由主节点负责ping 所有其他节点 判断是否有节点已经挂掉 创建或删除索引 决定分片在节点之间的分配 稳定的主节点对集群的健康是非常重要的 虽然主节点也可以协调节点 路由搜索和从客户端新
  • 6.84 C++ 遍历数组的几种方式

    1 计算出数组长度进行遍历 数组类型确定 数组中每个元素本身的字节大小就已经确定 利用 sizeof 函数可以计算出数组长度 而后利用 for 循序进行数组的遍历 2 使用类似 foreach 的方式进行遍历 C 中也可使用类似 forea
  • AVI文件与WAV文件格式

    AVI 与WAV文件都属于RIFF文件 因此都遵循RIFF文件的格式要求 先看看RIFF文件的格式 第一 RIFF 大小 AVI WAV 数据 第二 RIFF 文件中实际的数据通常采用列表 list 和块 Chunk 的形式表示 列表结构为
  • 智能门锁电路图_蓝牙门锁原理图一览 蓝牙智能门锁工作原理介绍

    蓝牙智能门锁工作原理是什么 蓝牙门锁原理图步骤详解 蓝牙智能门锁主要是通过手机开锁的方式来解锁 相比传统门锁 蓝牙门锁更加便捷 此外 还可以通过手机APP来实现门锁实时管理 访客管理 是符合智能家居时代对门锁要求的电子产品 那么蓝牙智能门锁
  • tesseract api C++使用例子

    转自 https code google com p tesseract ocr wiki APIExample APIExample API examples Updated Aug 12 2014 by theraysm gmail c
  • unsigned int 和 signed int 的区别

    unsigned int 和 signed int 的区别 对于 int 类型 默认是带有正负号的 也就是说 int 等同于 signed int signed int 等同于int 都能表示正负数 1 signed int 可以表示正整数
  • SQL优化之LIMIT语法, limit n,m 和 limit n有什么区别?

    在某些面试题中会遇到这样的问答或笔试题 limit 0 1 和 limit 1有什么区别 要准确回答这个问题就等深入明白limit一个参数和两个参数的本质区别 limit n m 中的第一次参数n表示的游标的偏移量 初始值为0 第二个参数m
  • Codeforces Round #367 (Div. 2)【贪心、差分、DP、字典树、二维链表】

    Codeforces Round 367 Div 2 A Beru taxi 就是问 我们知道一个点 从其他点到它的最少花费的时间是多少 include
  • 三次握手,四次挥手白话文

    三次握手和四次挥手是TCP协议中用于建立和断开连接的过程 三次握手 Three way Handshake 客户端向服务器发送一个SYN 同步 包 其中包含一个随机的初始序列号 表示客户端请求建立连接 服务器收到客户端的SYN包后 向客户端
  • 2022互联网精英副业指南,看到程序员的我笑了~

    不得不说 互联网人收入高 如果你以为互联网人收入高是因为工资高 年终奖丰厚 那你就错了 其实 还有一个原因是他们搞起了副业 副业千万条 闲鱼第一条 万万没想到的是 互联网人在闲鱼上赚钱也与众不同 甚至都一个比一个拼 https mmbiz
  • 【Java 集合 & 数据结构】优先队列 PriorityQueue

    优先队列 PriorityQueue 一 概述 二 结构 三 解析 1 核心属性 2 核心方法 offer 方法 入队列 poll 方法 出队列 peek 方法 队头元素 最小元 四 特点 优点 缺点 一 概述 优先队列 PriorityQ
  • Android String字符串截取方法总结

    Android String字符串截取方法总结 指定字符 截取字符串 返回字符串数组 String str abcd efg 123456 hijk 345 String strs str split 指定索引号 截取字符串 将字符串从索引
  • 服务器上创建Python虚拟环境

    应用场景 不同的项目 或者同一项目的不同版本 需要安装不同的Python解释器和依赖库 对于有python版本依赖的程序来说 为了安全可靠的管理环境 需要创建不同版本的 独立 隔离 的虚拟环境 virtualenv 是一个创建隔绝的Pyth
  • Java设计与实现“秒杀”活动之抢粽子【完整版】

    五月榴花妖艳烘 绿杨带雨垂垂重 五月新丝缠角粽 金盘送 生绡画扇盘双凤 正是浴兰时节动 正值端午佳节 实习公司也是例行放假三天以及给每一位员工发放了节日小礼品 过完端午又将迎来618活动专场 秒杀抢单活动也是此起彼伏 从而产生刺激性消费 由
  • 使用HiBurn烧录鸿蒙.bin文件到Hi3861开发板

    使用HiBurn烧录鸿蒙 bin文件到Hi3861开发板 鸿蒙官方文档的 Hi3861开发板第一个示例程序 中描述了 如何使用DevEco Device Tool工具烧录二进制文件到Hi3861开发板 本文将介绍如何使用HiBurn工具烧录
  • 网站服务器放本地还是云上,服务器放本地还是云上安全

    服务器放本地还是云上安全 内容精选 换一换 在弹性云服务器上安装完成后输入公网IP 无法连接目的虚拟机 端口无法访问工具 源端网络未连通目的端 目的端安全组未开放8084端口 目的端网络ACL禁用了8084端口 登录源端服务器后 在源端服务
  • Leetcode 计算质数 -- 埃氏筛、线性筛解析

    0 题目描述 leetcode原题链接 204 计数质数 1 埃氏筛 很直观的思路是我们枚举每个数判断其是不是质数 枚举没有考虑到数与数的关联性 因此难以再继续优化时间复杂度 介绍一个常见的算法 该算法由希腊数学家厄拉多塞 Eratosth
  • C语言/实现MD5加密

    本文详细视频讲解 已经发布到B站 https www bilibili com video BV1uy4y1p7on 更多仔细 请关注公众号 一口Linux 一 摘要算法 摘要算法又称哈希算法 它表示输入任意长度的数据 输出固定长度的数据
  • C语言头文件路径相关问题总结说明

    聊聊系统路径位置 绝对路径与相对路径 正斜杠 与 反斜杠 使用说明 by 矜辰所致 目录 前言 一 C语言中的头文件引用 二 KEIL 中的头文件路径 2 1 IncudePaths 指定的路径 绝对路径和相对路径 正斜杠 与 反斜杠 与双