当前位置: 首页 > news >正文

【C语言】头文件”“和<>的详解

前言

        作者在刚开始学C语言的时候,都是用的< >去引用头文件,但在学习STM32的时候发现,程序中大量使用" "去引用双引号。

        那么二者有什么区别呢?

        无论使用哪种方式,头文件的目的都是为了引用你需要的文件供你编程使用,那么这里就有一个很重要的问题:程序怎么知道你的头文件在哪?

#include <xxx.h>

        当使用<>来包含头文件时,编译器直接在系统的标准库路径中查找头文件,不会在当前源文件所在目录中查找。这种方式主要用于标准库的头文件,如stdio.h、stdlib.h等。

        以DEV C++为例,点击工具->编译选项->目录,可以看到这就是编译器的默认的系统标准库路径。

#include "xxx.h"

        当使用双引号来包含头文件时,编译器首先会在当前源文件所在的目录中查找指定的头文件。如果找不到,编译器会按照系统设置的标准路径去查找。这种方式通常用于项目内部的头文件,即用户自定义的头文件。

        假设你的C语言文件(main.c)是在D盘的project文件夹中,同时你自定义了一个头文件myheader.h,放在C语言文件的同目录中的include文件夹中,结构如图:

D/    
└──project/├── main.c└── include/└── myheader.h

 你需要引用myheader.h,可以这样写:

#include "include/myheader.h"

     编译器从当前源文件所在目录既main.c所在目录开始寻找include文件夹下的myheader.h
 

 < >和" "主要区别

  1. 查询头文件的起始位置不一样,<>从系统目录中查找;""从源文件目录中开始查找
  2. 查询范围不一样,<>只查系统目录;""查完源文件目录后如果没找到目标文件,就会查一遍系统目录

< > 和" "的兼容问题

        < >搜索路径查找头文件

        我们知道的是" "可以在里面写路径,去查找源文件目录下的自定义头文件;但很少人知道的是,< >也可以写入路径,去查找系统目录下头文件,但为什么不用呢?

因为<>会将系统目录下的内容全部扫描一遍,因此不需要写路径。

        但在某些情况下,也可以在尖括号中指定路径来引用头文件。这通常取决于编译器的实现和配置。

  1. 编译器支持:某些编译器可能允许在尖括号中指定相对路径或绝对路径来引用头文件。然而,这并不是标准做法,且可能不具有可移植性

  2. 项目配置:在大型项目中,可能会通过配置文件或编译选项来指定额外的头文件搜索路径。在这种情况下,即使使用尖括号,编译器也可能会在这些指定的路径中查找头文件。

  3. 示例:假设有一个自定义头文件mycustomlib.h位于项目的include/custom目录下,并且该目录已经被添加到编译器的包含路径中。那么,可以使用尖括号来引用这个头文

#include <custom/mycustomlib.h>

        【注意】这里最重要的是< >搜索路径,必须将目录添加到编译器包含的路径中才允许

        " "查找系统库头文件

        之前提到过," "会先查源文件目录,没找到头文件之后就会查系统库,因此" "是兼容< >的功能的,例如:

#include "stdio.h"

 这是被允许的,也可以找到这个头文件,但相对< >而言就会慢一点

总结

        无论是哪种方式,其根本目的还是为了找到相应的头文件,<>常用于系统库头文件的引用,""常用于自定义头文件,其本质区别在于搜索头文件的目录上。两者并非一成不变的,可以根据使用者的习惯灵活使用。

http://www.lryc.cn/news/506428.html

相关文章:

  • Elasticsearch:什么是信息检索?
  • Spark-Streaming容错语义
  • 2024年12月陪玩系统-仿东郊到家约玩系统是一种新兴的线上预约线下社交、陪伴系统分享-优雅草央千澈-附带搭建教程
  • GUI07-学工具栏,懂MVC
  • 【进程篇】04.进程的状态与优先级
  • ElasticSearch 数据聚合与运算
  • 科研学习|论文解读——智能体最新研究进展
  • 面试小札:Java后端闪电五连鞭_8
  • java error(2)保存时间带时分秒,回显时分秒变成00:00:00
  • 计算机毕业设计python+spark+hive动漫推荐系统 漫画推荐系统 漫画分析可视化大屏 漫画爬虫 漫画推荐系统 漫画爬虫 知识图谱 大数据毕设
  • 数字IC后端设计实现篇之TSMC 12nm TCD cell(Dummy TCD Cell)应该怎么加?
  • (8)YOLOv6算法基本原理
  • LNMP+discuz论坛
  • 在linux系统的docker中安装GitLab
  • Python面试常见问题及答案12
  • 从0-1开发一个Vue3前端系统页面-9.博客页面布局
  • [手机Linux] 六,ubuntu18.04私有网盘(NextCloud)安装
  • 白话java设计模式
  • 助力 Tuanjie OpenHarmony 开发:如何使用工具包 Hilog 和 SDK Kits Package?
  • NSDT 3DConvert:高效实现大模型文件在线预览与转换
  • 电商数据采集电商,行业数据分析,平台数据获取|稳定的API接口数据
  • VUE+Node.js+mysq实现响应式个人博客|项目初始化+路由配置+基础组件搭建
  • Python如何正确解决reCaptcha验证码(9)
  • web3跨链预言机协议-BandProtocol
  • JAVA将集合切分成指定份数(简易)
  • 深度神经网络(DNN)在时序预测中的应用与缺陷
  • springboot445新冠物资管理(论文+源码)_kaic
  • C++算法第十一天
  • 常 用 类
  • ACL(访问控制列表)