文件头_金橙智能 | C语言头文件组织与包含原则,你知道吗?

点击蓝字

关注我们

同学们知道C语言中头文件的组织与包含原则吗?如果你还不知道,那么小橙来给你讲解一下,希望同学可以认真学习。

头文件的作用

程序执行在预处理阶段,编译器会把源文件包含的头文件中的内容复制到 #include 处,在源文件编译时,会把包含进来的头文件内容一起编译,生成目标文件 .obj 。 当我们接触到模块化编程的时候,几乎每个功能模块都会写成一个函数文件,然后头文件为使用该模块的用户提供 接口 。接口是说该功能模块对外给其他模块访问的具体功能入口和方法。 当我们使用源文件实现功能模块时,我们要使用头文件对外的接口。而且用户只需要包含对应的头文件可以使用该头文件中暴露的接口。 使用头文件包含的方法可以把程序中的各功能模块串联起来,从而清晰模块化编程很有帮助。下面我来列举几个头文件的具体作用: (1) 源代码保密,只需要调用功能 。在我们工作中,会出现很多场合,我们的源代码不可以对外公布,此时我们只需要向用户提供头文件和二进制库即可。此时,使用该功能模块的用户只需要按照我们在头文件中提供的接口声明来调用库功能,不用关心接口内部函数如何实现。 (2)头文件可以帮助我们 检查出类型错误 。如果接口实现方式与头文件声明不一致,编译器就会指出错误。这样可以减轻我们的调试、改错的负担。 在源文件中应仅包含必需的头文件,尽量不要导致所包含的头文件太庞大,否则会严重降低编译速度。

e7d8436805eb3f50631b204d615507ba.png

头文件编写原则

模块化编程会编写两个文件,一个是源文件,另一个是对应的头文件。我们在源文件中实现变量、函数的定义,并且制定链接的范围。在头文件中书写对外可以调用的全局变量、函数声明以及数据类型和宏定义。 头文件编写要注意以下原则: (1) 分类原则 :类型定义、宏定义、函数声明尽量都分离开,分别位于不同的头文件中。并且内部函数声明头文件与外部函数声明头文件声明相分离。 (2) 语义层次化原则 :头文件定义的时候需要有语义层次。对于不同层次的类型定义以及不同类型的层次的函数声明都不要放在同一个头文件中。 (3)头文件的 命名 尽量要与实现功能的源文件 相同 ,比如delay.c和delay.h。尽量在源文件中包含同名的头文件。 (4)头文件中 不应包含本地数据 ,来降低模块间的耦合度。就是说源文件不对外声明只是自己使用的类型、宏定义和变量不应该出现在头文件里,以防止外部调用。 (5)头文件中 不允许定义变量和函数 ,只能定义宏、类型(typedef,struct,union,enum等)以及变量和函数的声明。 (6)如果是 说明性 头文件,则不用有对应的源文件。该类头文件中大多包含大量概念性宏定义或枚举类型定义,不包含任何其他类型定义和变量或函数声明。此类头文件也不应包含其他文件。 (7)使用 #pragma  once 或 header guard 避免头文件被重复引用。#pragma once虽然非标准但已经被现代编译器广泛支持,它告知预处理器“不要重复包含当前文件”。header guard是通过以下预处理命令防止被重复包含:

5c94cbe320f202cc15b593a4e45dd1e5.png

头文件包含原则

我们在实际编程中,可能会因为头文件包含不正确从而引发编译报告符号未定义或重复定义的警告。只需要在引用符号前确保它已经被声明或定义,就可以消除未定义的编译错误。 (1)建议头文件包含顺序从特殊到一般,比如:

133300fb4cb3c0864580ee78c360c373.png

(2)要 减少头文件的嵌套和交叉引用 ,头文件包含真正需要显示包含的头文件。如果过多的头文件嵌套和交叉引用会使程序和文件架构变得比较复杂和混乱,可能会引发未知错误。 (3)头文件应该是 完整 的,是指在任一源文件中包含任一个头文件而不会产生编译错误。 (4)对于函数库(标准库和自定义的公共宏及接口)的头文件,可以将他们加到一个 通用 头文件中。并且需要控制该头文件的体积,并要保证所有源文件首先包含该通用头文件。 说明 :在该文中,除非特殊说明,“源文件”指.c文件,“头文件”指.h文件,“引用”是指包含头文件。
声明:金橙智能所推送文章,目的在于分享知识,若图片及某些文字言论涉及版权问题,请联系微信:NN18538260213  我们会在24小时内删除处理,谢谢

bd6c4cb23fcb97b6aa0e129c35f5c935.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值