关于C语言头文件引用的基础及进阶知识(个人理解)

2023-05-16

一、< >与“ ”的区别?

使用尖括号< >,编译器会到系统路径下查找头文件;
而使用双引号" ",编译器首先在当前目录下查找头文件,如果没有找到,再到系统路径下查找。

所以:使用双引号比使用尖括号多了一个查找路径,它的功能更为强大。

而我们自己编写的头文件,一般存放于当前项目的路径下,
所以不能使用尖括号,只能使用双引号。(或者你把头文件放到系统路径中,但这样比较麻烦)

好的编程习惯是:
我个人的习惯是使用尖括号来引入标准头文件
使用双引号来引入自定义头文件(自己编写的头文件),这样一眼就能看出头文件的区别。

这里大家可以深入了解系统路径是什么情况。

二、如何将自己写的函数放到头文件中?

重点来了 怎么include自己写的函数
如果我有三个文件 main.c my.h my.c
①My.c 里面定义函数
②my.h里面写函数声明
③Main.c里面写 #include 即可

这样来看,这种做法的最大好处就是main.c这个文件看起来比较简洁,因为相比在main.c里面定义函数的唯一区别就是定义和声明都在另外的文件中。

以上只是基本用法

三、关于引用头文件的进阶用法

进阶用法: 杂七杂八看了很多网站 我自己总结:(可能有不对欢迎指出~)

1.可以嵌套包含 就是a.h 里面写 #include “b.h”

为什么写程序时要用嵌套包含 俺暂时未了解
其实嵌套包含是一种不太好的事情 会造成编译逻辑混乱 降低效率
尤其可能导致重复包含 还要额外设置防重复包含的头文件写法等 所以尽量减少嵌套包含
这里重复包含具体是指:a.h文件中#include"c.h"
而b.h文件中也#include"c.h"
这样表面上看不出来,但实际上造成了重复包含的问题

2.如何防止重复包含 重复包含同一个头文件会降低编译效率

在头文件中这样写:(假设头文件名字为my.h)
#ifndef MY_H
#define MY_H
…声明内容
#endif

这种方法的本质就是加一个 标记 作区分
注意:

①这里的MY_H视为符号,只有区分作用,一般取名时要和头文件名一致且大写,以免其他头文件取名时重复,包含这个头文件时写法依然是#include”my.h”。如果其他头文件也用MY_H,在include时这个头文件在my.h之后写,那么这个头文件就包含失败。

②这种写法虽然可以减小重复包含的坏影响 但也会降低编译速度
所以最好就不要重复包含

但是为什么相比重复包含要好一点呢?
因为重复引用 引用的头文件里面有时声明好多行 浪费很多时间
而这种写法才几行 对吧?

3.小注意点

注意 依然以main.c my.c my.h为例
在my.c里面定义函数时也可能会include很多头文件
这些头文件在my.h里面不需要表示

四、小白の疑惑

当时接到项目时发现头文件这块我完全不会才补了一点知识,
但是有没有大佬告诉我为什么现成的代码里会有嵌套包含这种现象存在?
求解~

在这里插入图片描述

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

关于C语言头文件引用的基础及进阶知识(个人理解) 的相关文章

  • 网络安全计算机基础

    计算机网络概念 xff1a 实际上是将分布在不同地理位置 xff0c 且具有独立功能的计算机 通过通信链路以及通信设备 xff0c 在网络操作系统 xff0c 网络管理软件及网络通信协议的管理和协调下实现信息传输与资源共享形成的计算机系统
  • ImportError:No module named ‘PIL‘

    运行时报错 xff1a ImportError No module named 39 PIL 原因是缺失一个pillow的数据包 xff0c 不能直接 pip install PIL xff0c 会提示找不到这个安装包 xff0c 需使用如
  • c++中#与##的作用

    1 c 43 43 中 用于把转换成字符串 define T A A 没有使用 using namespace std int main cout lt lt 34 T 2 34 lt lt T 2 lt lt endl cout lt l
  • 人工智能实验——八数码难题

    人工智能实验 八数码难题 人工智能实验 八数码难题 人工智能实验 八数码难题八数码难题简介八数码难题所用到的算法简介代码实现解释运行结果显示代码附件程序可视化 八数码难题简介 八数码问题指的是定义一个3 times 3的格子 xff0c 然
  • idea报错unable to reload maven project

    文章目录 前言一 问题状况二 解决步骤三 卸载maven仓库四 重新安装依赖总结 前言 今天从公司的svn中检出了一个老项目 xff0c 是jQuery 43 spring打造的项目 xff0c emmmm用eclipse编写 xff0c
  • VNC树莓派无法连接

    问题 xff1a 树莓派配置好VNC后 xff0c 第二次通过笔记本远程连接失败 xff0c 报错refused by the computer 解决方法 xff1a 在putty中输入IP地址登录树莓派 xff0c 输入vncserver
  • 经典LCA例题:P4180 [BJWC2010] 严格次小生成树

    Acwing xff1a 严格次小生成树 xff08 求两点间路径上最大边的权值 xff09 模板 洛谷 xff1a 严格次小生成树 求两点间路径上最大边的权值 xff0c 就不能通过前缀和了 xff0c 会丢失信息 每个结点存到其他结点的
  • linux下的压缩与解压缩

    由于计算机中的数据有些需要备份从而归档一个大文件中 下面介绍一下常用的linux压缩解压缩命令 1 关于tar的命令 参数解析 xff1a c 创建生成打包的文件 v 列出打包和解包的详细过程 xff0c 显示进度 f 指定文档的名称 xf
  • 关于fixed frame【odom】does not exist的问题

    在执行完roslaunch mbot description arbotix mbot with camera xacro launch后 xff0c 终端末端是否出现以下一段红色字体 xff0c 若有 xff0c 则此篇文章对你或许有用
  • Linux安装配置Tomcat

    1 下载Tomcat服务器 链接 xff1a https pan baidu com s 15wEXVJWdUUuXX1xRnXylUQ 提取码 xff1a 1234 官网下载 xff1a Apache Tomcat Apache Tomc
  • Oracle类型number与PG类型numeric对比和转换策略

    Oracle 11g number 任意精度数字类型 http docs oracle com cd B28359 01 server 111 b28318 datatype htm CNCPT313 存储数据的范围 正数 xff1a 1
  • 强制关闭linux进程

    问题 xff1a 卡住 xff0c 鼠标可以移动但点击无反应 xff0c 键盘可用 方法 xff1a xff08 1 xff09 Ctrl 43 Alt 43 T 打开终端 xff0c 输入top xff0c 显示的全是现在系统的进程 xf

随机推荐

  • 【计算机系统遇到的问题】win11权限开启方法——相机、麦克风等权限——“其中一些设置由你组织管理”

    win11更新后 xff0c 想必大家应该会出现跟我一样的问题 无法开启权限 xff0c 不知道在哪开启权限 我是在下午跟我老爸视频电话的时候发现这个问题的 xff0c 点击开摄像头 xff0c 但是我这边跟老爸那边却没有我的画面 xff0
  • gitlab安装部署

    本教程使用centos7 6 首先安装依赖包 yum install y curl policycoreutils python openssh server 如下提示相关依赖安装完成 安装步骤如下 xff1a 1 使用官方脚本添加yum源
  • 用51单片机中断控制LED灯亮灭

    用51单片机中断控制LED灯亮灭 span class token macro property span class token directive keyword include span span class token string
  • HDFS

    xff08 一 xff09 HDFS简介及其基本概念 HDFS xff08 Hadoop Distributed File System xff09 是hadoop生态系统的一个重要组成部分 xff0c 是hadoop中的的存储组件 xff
  • 如何在服务器用docker搭建Redis集群

    用docker部署Redis集群 这里用的是分片 43 高可用 43 负载均衡 xff0c 三主三从 第一步创建网卡 span class token comment 创建网卡 span span class token function
  • P1825 [USACO11OPEN]Corn Maze S——bfs

    USACO11OPEN Corn Maze S 题面翻译 奶牛们去一个 N M N times M N M 玉米迷宫 xff0c 2
  • 7-57 租用游艇问题——dp

    长江游艇俱乐部在长江上设置了n个游艇出租站1 xff0c 2 xff0c xff0c n 游客可在这些游艇出租站租用游艇 xff0c 并在下游的任何一个游艇出租站归还游艇 游艇出租站i到游艇出租站j之间的租金为r i j 1 lt 61 i
  • 三种接口实现增删改查

    目录 ArrayListHashSetHashMap ArrayList ArrayList 实现增删改查 span class token keyword package span span class token namespace t
  • 旗帜软件工作室2021年年度交接会议总结

    只有时间的消逝 xff0c 才使我们注意到时间 在小组的一年时间过的飞快 xff0c 在这一年里我们的心智品性和专业能力都经历了充分了磨练 和一年前的我们相比 xff0c 如今的我们更加成熟稳重 xff0c 不再心浮气躁 xff1b 在自己
  • nested exception is org.springframework.beans.factory.BeanCreationException: 不能注入对象 创建对象失败 spring...

    出现错误的背景 在使用Spring 43 SpringMVC 43 Mybatis SSM集成框架时 xff0c 服务器启动就会报错 错误根源 XML配置错误 解决方案 第一步 查找springmvc xml 配置文件中 是否添加了扫描注解
  • 算法练习——(2)逢7过

    1 中国朋友们聚会时喜欢玩 34 逢7过 34 的游戏 xff0c 老外有个同样的游戏 xff0c FlipFlop xff0c 它从1计数到100 xff0c 顺序输出 当遇到3的倍数就要说 Flip xff0c 遇到5的倍数就要说 Fl
  • beego的安装和简单使用

    beego的安装和使用 beego安装升级 beebee工具的安装 使用beebee newbee apibee runbee packbee version beego beego 是免费 开源的软件 xff0c beego 源代码目前托
  • 网络爬虫——GO

    这里写目录标题 go colly网络爬虫框架goquery HTML解析goquery主要的结构怎么使用goquery常用选择器 go colly网络爬虫框架 go colly是用Go实现的网络爬虫框架 go colly快速优雅 xff0c
  • LeetCode每日一题(12)——按奇偶排序数组(双指针)

    按奇偶排序数组 1 题目2 示例3 思路4 代码 1 题目 给你一个整数数组 nums xff0c 将 nums 中的的所有偶数元素移动到数组的前面 xff0c 后跟所有奇数元素 返回满足此条件的 任一数组 作为答案 2 示例 示例 1 x
  • LeetCode每日一题(25)——最少移动次数使数组元素相等 II

    最少移动次数使数组元素相等 II 1 题目2 示例3 思路4 代码 1 题目 给定整数数组 nums 和整数 k xff0c 请返回数组中第 k 个最大的元素 请注意 xff0c 你需要找的是数组排序后的第 k 个最大的元素 xff0c 而
  • LeetCode每日一题(26)——高度检查器

    高度检查器 1 题目2 示例3 思路4 代码 1 题目 学校打算为全体学生拍一张年度纪念照 根据要求 xff0c 学生需要按照 非递减 的高度顺序排成一行 排序后的高度情况用整数数组 expected 表示 xff0c 其中 expecte
  • 乱码的原因和发展(关于编码)

    乱码的原因和发展 xff08 关于编码 xff09 正文1 引言2 什么是编码3 ASCII 美国人先搞出了 美国信息交换标准代码 4 GB 2312 我国 1980 年公布的 GB 2312 80 信息交换用汉字编码字符集 基本集 5 G
  • 左神算法笔记(异或)+C语言实现

    异或 性质运算性质应用举例1 不用额外变量 xff0c 交换两个数的值原理代码 2 找到数组中唯一一个出现奇数次的数字3 提取最右侧的1 xff08 常用 xff09 应用1 xff1a 找到数组中唯二出现的两个出现奇数次的数字代码应用2
  • C:指针+动态内存 错题(反思在最后)

    1 写一个函数将以秒计数的时间转换为以时 分 秒计数的时间 函数原型为 xff1a char seconds to int seconds 编写main调用测试它 输入格式要求 xff1a 34 d 34 提示信息 xff1a 请输入时间
  • 关于C语言头文件引用的基础及进阶知识(个人理解)

    一 lt gt 与 的区别 xff1f 使用尖括号 lt gt xff0c 编译器会到系统路径下查找头文件 xff1b 而使用双引号 34 34 xff0c 编译器首先在当前目录下查找头文件 xff0c 如果没有找到 xff0c 再到系统路