c源文件中要包含自己的头文件

2023-05-16

原博客链接:

https://blog.csdn.net/khwkhwkhw/article/details/49798985?utm_source=app&from=timeline

 

 

引言:

            我们经常在c工程中发现,源文件中要包含自己的头文件。一直以来,都不知道为什么这样做。现在,我知道了。

以前的认知:

 我认为,.c文件没有必要包含自己的.h文件。.h文件包含.c文件中定义的函数和全局变量的声明,.h文件就是.c文件提供的对外接口文件。既然.h文件就是.c文件提供的对外接口文件,那么.c文件就没必要包含自己的.h文件了(.h文件是对外提供用的,对内又何必再包含进来呢)。

          鉴于这样的理解,我对于工程中.c源文件包含自己的.h头文件很是不理解,不知道为什么要这样做。

现在对此的理解:

          但是现在,我知道为什么要源文件包含自己的头文件了。

如下,一段书中的原话:

“如果希望让编译器检查声明的一致性,一定要把全局声明放到头文件中。特别是,永远不要把外部函数的原型(也就是函数声明)放到.c文件中:通常它与定义的一致性不能得到检查,而矛盾的原型(也就是函数声明)比不用还糟糕。”

注意:外部函数的原型,就是外部函数的声明。

对这段话的理解:

      为什么:“永远不要把外部函数的原型放到.c 文件中”

这个外部函数A指的是B.c文件之外定义的函数,B.c文件中需要使用外部函数A,就需要先对外部函数A声明(对外部函数的声明就是外部函数原型)。对这个外部函数A的声明,不能放在B.c文件里面来实现。

以实例说明:

①假若工程中有2个源文件a.c和b.c;a.c的头文件为a.h,b.c的头文件为b.h。

②a.c中定义了一个函数sum。

③b.c要引用sum这个函数。做法是:在b.c中声明sum这个函数。然后b.c就可以使用sum函数了。

这样的做法就是把外部函数sum的声明放到了b.c中来。然而,这样的做法很不妥。

不妥的原因

sum是在a.c中定义的,而声明确是在b.c中,sum函数的定义和声明不是在同一个文件中的。定义和声明不在同一个文件中,编译的时候,编译器就不能对定义和声明的一致性进行检查。这样,如果sum的定义和声明不一致,编译器就无法检查出来(定义和声明不在同一个文件中),那么编译的时候不会报错,但是程序运行的时候就可能会出错。而这样的错误,查找起来又不是很容易。

鉴于此,才这样说:“永远不要把外部函数的原型放到.c文件中”。

那如何才能让编译器检查定义和声明的一致性呢?

前面说,如果把外部函数的原型放到.c文件中,编译器就无法检查声明和定义的一致性(声明和定义不在同一个文件中)。那么,要让编译器检查定义和声明的一致性呢,自然是把定义和声明放在同一个文件中,而如何实现把定义和声明放在同一个文件里呢?

答案:源文件定义的函数,在源文件对应的头文件中声明,然后源文件包含自己的头文件。这样定义和声明就放在同一个文件里了。

 

 

 

援引上述例子:a.c中定义了函数sum,而函数本质上是外部的,函数sum是可以被其它源文件调用的。那么,我们把sum函数的声明放在a.h中。然后a.c源文件还要包含自己的头文件,也就是a.h文件。而b.c文件要引用sum函数,就直接包含a.h文件就可以。

sum函数的定义在a.c中,声明是在a.h中,但是由于a.c包含了a.h,所以sum的定义和声明就是在同一个文件a.c中了。这样,编译器编译的时候,就能对sum函数定义和声明的一致性做检查,如果不一致,就会报错。

至于其他源文件引用这个外部函数sum,不再采用直接声明的方式,而是通过包含a.h头文件的方式。

这样,编译器检查了sum函数定义和声明的一致性没有报错,也就表明a.c中sum函数的定义和a.h中sum函数的声明是一致的。那么其他源文件都是通过直接包含a.h,来使用函数sum,就也保证了sum函数声明和定义的一致性了。

结论

c源文件要包含自己的头文件,目的就是让编译器检查定义和声明的一致性。

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

c源文件中要包含自己的头文件 的相关文章

  • QQ通过xml卡片自动探测对方ip

    鸽了这么久 xff0c 终于来写这篇文章了 xff0c 话说回来 xff0c 这个方法是一个月前就开始用的了 xff0c 现在才来写 xff0c 因为我懒嘛 xff0c 绝对不是因为我懒哈 xff0c 是因为之前的方法一直不适合绝大多数用户
  • MathType7数学公式编辑使用计算详细教程

    强大的MathType软件是一款适用于Windows和Mac的交互式方程编辑器 xff0c 你可以为网页 出版物 说明以及TeX LaTeX MathML文档创建数学符号 下文将具体为大家介绍 MathType软件到底有哪些特色与优势 1
  • 关于app提示专为旧版Android打造的有关测试

    因为经常进自己网站左康右康有没有人访问 极度自恋 xff0c 老是去翻浏览器书签很麻烦 xff0c 最近就想着把网站打包一个app xff0c 虽然我这破站也没什么可看的 xff0c 不过至少打包后加点快捷功能就看不出来我一直在划水了 0x
  • 一次对带病毒软件的分析

    昨天在某葫芦侠看到实用软件版块有一个youtube视频下载器 xff0c 正好需要我就去整了一个拿来用 xff0c 下载下来打开提示有病毒 xff0c 我寻思多半又是nt安全软件瞎报 xff0c 就随手点了信任 xff0c 然后再次打开 x
  • 百一测评网站切屏检测绕过

    事情是这样的 xff0c 这几天不是临近期末嘛 xff0c 老师都开始划重点 xff0c 准备在线考试的老师也在开始测试线上考试了 xff0c 今天人工智能在百一测评发下来一套测试 xff0c 想点进去看看能不能粘贴 xff0c 结果刚出去
  • NTLM及Kerberos认证流程

    NTLM及Kerberos认证流程 NTLM认证 1 概念 NTLM是NT LAN Manager的缩写 xff0c NTLM 是指 telnet 的一种验证身份方式 xff0c 即问询 应答身份验证协议 xff0c 是 Windows N
  • 哈希传递攻击/黄金白银票据

    Q amp A Q1 xff1a pth在什么情况下能成功 哈希传递受到什么限制 什么情况下不能传递 xff1f A1 xff1a pth在获取到目标机器中RID为500的内置管理员账户或在目标机器本地管理员组的域成员账户的hash值的情况
  • MySQL查询多条数据,只取最新的一条数据

    首先 查询表fp studentItem中的studentid 61 1 xff1b 有5条数据 xff0c 我只想要id 61 163的最新数据 两种方法 xff1a 1 SELECT FROM fp studentItem where
  • 2018年最全iOS开发之第三方库

    最全iOS开发之第三方库 最新增加 EAIntroView 一个灵活的介绍界面 可以用作引导页 UI 下拉刷新 EGOTableViewPullRefresh 最早的下拉刷新控件 SVPullToRefresh 下拉刷新控件 MJRefre
  • 关于原码、反码、补码的一点心得

    在看本篇文章前 xff0c 请先抛弃类比于时钟的想法 xff0c 个人觉得那种理解方法真的没有必要 xff0c 还容易把自己搞糊涂 下面来了 在现实世界中 xff0c 数字都是以源码表示的 xff0c 例如正4的自然二进制和负4的自然二进制
  • 傅里叶变换的推导

    首先 xff0c 隆重推出傅里叶级数的公式 xff0c 不过这个东西属于 文物 级别的 xff0c 诞生于19 世纪初 xff0c 因为傅里叶他老人家生于1768 年 xff0c 死于1830 年 但傅里叶级数在数论 组合数学 信号处理 概
  • 一个抓取网上教学资源的python包

    步骤 xff1a 1 安装依赖库 xff08 前提电脑要安装有python3环境 xff09 pip install requests BeautifulSoup4 lxml 2 下载一个外国网友分享的爬虫包 xff0c 传送门 https
  • FL Studio20版本下载后覆盖升级中文选项

    音乐不仅仅是娱乐的一种形式 xff0c 这就像在每个人的灵魂中表达情感的一种方式 如今 xff0c 越来越多的音乐人选择使用音乐制作软件来进行音乐的创作 xff0c 一台电脑 一款软件以及一个外接MIDI就是一个小型的音乐工作站 xff0c
  • 驱动程序(1) win10下Visual Studio 2017的安装以及双机调试搭建

    前言 xff1a 毕业上班以来 xff0c 现在这个项目比较缺一个做windows下驱动程序开发的 xff0c 所以本人就负责这方面的工作 之前没有接触过 xff0c 完全萌新 xff0c 全靠一本武安河编著的 Windows设备驱动程序W
  • s域和z域变换笔记

    连续函数 1 常见信号的拉普拉斯变换 xff1a 脉冲信号 xff08 t xff09 1 阶跃信号 xff08 t xff09 斜坡信号 t 加速度信号 指数类信号 正弦类信号 cos wt sin wt 2 拉普拉斯变换性质 xff1a
  • 英语音标

    1 元音字母 a e i y o u 2 y属于半元音 3 其他的都是辅音字母 音标 元音音标 a 1 e 2 i e 1 e 2 i i 1 e 2 ai o 1 e 2 eu u 1 e 2 ju 辅音音标 b 1 b eg bike
  • 标准日本语初级上-------(1~12课)

    常用寒暄语 早上好 你好 晚上好 用于告别时的再见 晚安 初 願 初次见面 请多关照 常用于打招呼或者道歉 谢谢 不用谢 用于吃饭之前 用于吃饭后 你也一样 用于祝福
  • 反三角函数

    反函数以原函数的定义域为值域 以原函数的值域为定义域 反函数关于y 61 x对称 反正弦函数arcsin x sin 1 x sin x在主值区间 pi 2 pi 2 上的反函数 反余弦函数arccos x cos x在主值区间 0 pi
  • 三角变换关系

随机推荐

  • 高中解析几何复习

    连接 https wenku baidu com view 3f9d777476a20029bd642dc7 html
  • 日本语外来语(片假名)与英语发音对照

    k t 或者不读 r te 不断更新中 有新的发音欢迎留言
  • 标准日本语13~24课

    短语 表示 暂先 相当的 表示夸奖他人 相当的 不过程度更加强烈 除了表示已经 和过去时搭配 还可以表示马上 就要 的意思 与现在时搭配 表示劳驾 搭讪 那请吧 用于对对人邀请的同意 金 xff08 xff09 下 xff08 xff09
  • 标准日本语25~36课

    短语 表示做某事或某事态发生的时间渐渐迫近 那样的话 表示并不十分理想 但是还能过得去 xff5e xff5e 表示某个容器达到饱和状态 表示 正确 无误 恰当 xff0f 接在量词后面 表示大致 肯定上面的句子 但是有附加条件 今度 xf
  • 标准日本语37~42课

    短语 表示名副其实 凭感觉的判断 总觉得 特意 好不容易 43 小句 43 表示特意 但是是为下句的遗憾做铺垫的 接在数量词后 表示数量的全部 哎呀 语气词 啊 对不起 哪里 是我不好 以后当动词不特意强调形态时 便默认为基本形 语法 1
  • FL Studio水果简体中文20.9版本下载

    FL Studio软件全称是Fruity Loops Studio xff0c 由于这款软件自身logo长得像水果 xff0c 所以我们也习惯叫它 水果 它是一款全功能音频编辑工具 xff0c 将编曲 剪辑 录音以及混音集为一体的音乐编曲软
  • 嵌入式系统专用术语

    1 与硬件相关 封装 封装是指用塑料 金属或陶瓷材料等把集成电 路封在其中 封装可以保护芯片 xff0c 并使芯片与 外部世界连接 印刷电 路板 印刷电路板 PCB板 xff0c 是组装电子元件用的基板 xff0c 是电路原理图的实物化 P
  • 嵌入式C语言

  • GCC编译C语言-常见错误收录

  • 编译器报错的常见单词

    local 局部的 assignment 赋值 分配 variable 变量 incompatiable 不兼容的 initialization 初始化 conflicting 矛盾的 冲突的 statement 语句 status 状态
  • 自动控制原理(上)

    控制系统的分类 恒值控制系统 程序控制系统 随动控制系统 控制系统的基本要求 稳定性 快速性 准确性 系统的传递函数G s 输出和输入在零初始条件下 的拉氏变换比 传递函数的分母多项式 称为系统的 特征式 其最高阶次称为系统的阶次 零特征式
  • 大学时代的一些常用单词(自动化,计算机)

    proportional 比例 integral 积分 derivative 微分 polynomial 多项式 inf 无穷大 format 格式 class 类型 angle 角度 degree prime 首要的 sqrt 根号 Na
  • PID控制原理

  • matlab数据类型的一点心得

    https blog csdn net kyang624823 article details 78678075 重点看 https blog csdn net u011501388 article details 78351305 tic
  • 关于修复系统引导的一点心得

    昨天使用一款叫做分区助手的软件给笔记本C盘扩容 过程很顺利 但是在开机的时候却发现系统无限进入修复模式 用pe进入系统后 查看了各个盘的状态 还好所有盘的数据都还健在 通过这里 我也排除了C盘被清空的可能性 而且也进bios排查了设备的启动
  • 关于因中文路径而报错的一个解决办法

    昨晚安装UG10 0版本 虽然软件没有安装到中文路径下 但是因为我的账户名是带有中文的 而软件的一个临时文件夹Temp位于我的账户路径下 所以在打开软件时提示该路径出现错误 解决办法是在C盘下再建立一个Temp文件夹 打开环境变量 修改Te
  • FL Studio2023最新版可以切换成中文语言界面

    FL Studio 21是业界比较知名的水果编辑软件 xff0c 集成了音乐编辑 音频编辑和编曲等多种功能 xff0c 让你从零开始学习音乐编曲 有用户在下载FL Studio 21后不知道怎么安装和汉化 xff0c 其实简单的做下系统的设
  • 解决moocUWP版缓存PDF卡住的方法

    在设置里面把同时下载数改为1个
  • C语言中的预编译指令(不完善)

    请把此博文和这篇博文结合阅读 1 void 可以用来定义空类型指针 该指针不指向任何类型 但是在需要时可以转化为任何类型 2 嵌入式C语言在编译的时候 会先对程序中一些特殊的命令进行预处理 然后将预处理的结果和源程序一起再进行编译 预处理包
  • c源文件中要包含自己的头文件

    原博客链接 https blog csdn net khwkhwkhw article details 49798985 utm source 61 app amp from 61 timeline 引言 xff1a 我们经常在c工程中发现