从零开发操作系统-聊一聊C语言中的头文件

news/2024/12/5 17:45:40/

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益:

  1. 了解大厂经验
  2. 拥有和大厂相匹配的技术等

希望看什么,评论或者私信告诉我!

文章目录

  • 一、背景
  • 二、C语言头文件
    • 2.1 `.h` vs `.c`
    • 2.2 `.h` 文件的好处
    • 2.3 为什么会选择`.h` 这种实现方式
  • 三、总结

一、背景

其实也没有啥背景。
最主要的原因就像 《30天自制操作系统》一书作者说的那样,写一个操作系统,仅仅想想就是一件特别有趣的事情呢。一两年前曾经入手开始写过,但慢慢的就不了了之了。现在又有这个想法了,准备一直干下去,最终写一个操作系统出来,算是程序员生涯的一份礼物。

其次的原因,是因为我也认为未来初级程序员的岗位会越来越少,借助 LLM 人人都是初级程序员可能会变成现实。这个时候专业性和底层就会越来越重要。

二、C语言头文件

《30天自制操作系统》进入到了第六天,开始对C的代码进行重构。重构的过程中遇到了两种类型的文件 .h.c 接下来会重点介绍一下这两种文件

2.1 .h vs .c

在C语言中,.h(Header)文件和.c(Source)文件是两种不同的文件类型,它们在编译和链接过程中扮演不同的角色。

  1. .h 文件(Header 文件):
    • .h 文件通常包含函数声明、宏定义、类型定义和包含其他.h文件的指令。
    • 这些文件用于定义和声明可以在多个.c文件中使用的符号和结构。
    • .h 文件可以被多个.c文件包含,以避免重复定义和声明。
    • 它们通常位于项目的头文件目录中,并且以.h结尾。
  2. .c 文件(Source 文件):
    • .c 文件包含实际的函数实现、变量声明和代码逻辑。
    • 这些文件通常用于编写程序的主要功能和算法。
    • 每个.c文件可以包含一个或多个函数的实现,以及相关的变量和数据结构。
    • 它们通常位于项目的源文件目录中,并且以.c结尾。
      在编译过程中,.c 文件会被编译成目标文件(.o 文件),而.h文件则不会被编译。在链接过程中,.o 文件会被链接器合并,生成可执行文件或库文件。.h 文件在链接过程中不参与,因为它们只包含声明,而不是实现。
      总结来说,.h 文件用于定义和声明,而.c 文件用于实现和编写代码。两者共同工作,以确保代码的可重用性和模块化。

2.2 .h 文件的好处

另外也可以在不使用.h文件的情况下达到相同的效果,但是使用.h文件通常可以提高代码的清晰度、可维护性和重用性。以下是使用.h文件的一些好处:

  1. 模块化.h文件可以包含多个.c文件中使用的公共声明,如函数原型、宏定义和类型定义。这有助于将代码组织成模块,每个模块负责不同的功能。
  2. 减少重复:通过在.h文件中定义和声明,可以避免在多个.c文件中重复编写相同的声明。
  3. 易于维护:当需要修改或更新公共声明时,只需在.h文件中进行一次更改,所有包含该.h文件的.c文件都会自动更新。
  4. 提高可读性.h文件可以帮助开发者快速了解哪些声明和函数可以在项目中使用,而不需要阅读所有.c文件。
  5. 隔离依赖.h文件可以包含依赖关系,这有助于确保编译器知道哪些.c文件需要被编译以支持特定的声明。
  6. 减少编译时间:编译器在编译.c文件时会检查其依赖关系。如果一个.c文件包含一个.h文件,编译器不需要再次编译.h文件,这可以加快编译速度。
  7. 跨平台支持.h文件可以包含平台特定的宏定义,这有助于在不同的操作系统上编译和运行代码。
    尽管可以使用全局.c文件来代替.h文件,但是这种做法通常会导致代码混乱,难以维护,并且编译时间可能会增加。因此,除非有特殊原因,推荐使用.h文件来组织和维护C语言项目。

2.3 为什么会选择.h 这种实现方式

目前没有明确的答案,C 的发明者也没有明确说,以下仅为猜测
C 语言的设计者 Dennis Ritchie 选择使用 .h 文件作为头文件的主要原因如下:

  1. 编译器技术:

    • 当时 C 语言的编译器技术还比较初级,需要依赖头文件来获取函数、变量等的声明信息。
    • 使用单独的头文件可以更好地满足编译器的需求。
  2. 模块化设计:

    • Ritchie 希望 C 语言能够支持模块化设计,将程序划分为多个源文件。
    • 头文件有助于实现模块化,使得程序更加清晰、可维护。
  3. 语言特性:

    • C 语言是一种偏底层的语言,更关注于程序的性能和控制。
    • 头文件的设计符合 C 语言的这种特性,为程序员提供了更细粒度的控制。
  4. 历史原因:

    • C 语言是在 1970 年代开发的,当时的编程环境和软件开发方式与今天有很大不同。
    • 头文件的设计是为了适应当时的编程环境。
  5. 可移植性:

    • 头文件有助于提高 C 程序的可移植性,因为它们封装了与平台相关的信息。
    • 这对于当时的计算机硬件和操作系统环境非常重要。
  6. 命名约定:

    • .h 是一个常见的文件扩展名,用于表示头文件。
    • 这种命名约定使得头文件更容易被识别和管理。

总之,Ritchie 选择使用 .h 文件作为头文件,是基于当时 C 语言的编译器技术、模块化设计需求、语言特性以及可移植性等因素。这种设计方式虽然在今天看来可能有些过时,但在 C 语言诞生的年代,它确实是一个合理的选择。

三、总结

文章围绕作者写操作系统初衷展开,着重讲解 C 语言里.h与.c文件差异、协同工作方式,凸显.h文件对提升代码质量的意义,剖析其设计成因,体现其在 C 语言编程体系里的重要与合理性。


http://www.ppmy.cn/news/1551225.html

相关文章

eBay 基于 Celeborn RESTful API 进行自动化工具集成实践

作者:王斐,ebay Hadoop 团队软件工程师,Apache Kyuubi PMC member,Apache Celeborn Committer。 简介:Apache Celeborn 是一个统一的大数据中间服务,致力于提高不同MapReduce引擎的效率和弹性。为了Spark …

ubuntu上安装redis

1、进入x-shell的操作界面 切换为root账户:sudo su 2、apt search redis:查找需要下载的redis相关软件包; 3、apt install redis:下载redis; 下载之后默认redis是启动的检查其状态: netstat -anp | grep re…

Android -- 简易音乐播放器

Android – 简易音乐播放器 播放器功能:* 1. 播放模式:单曲、列表循环、列表随机;* 2. 后台播放(单例模式);* 3. 多位置同步状态回调;处理模块:* 1. 提取文件信息:音频文…

Java基础面试题09:Java异常处理完成以后,Exception对象会发生什么变化?

一、Java异常(Exception)基本概念 什么是异常? 简单来说,异常就是程序运行时发生了意外的“错误”或者“不正常现象”,导致程序中断。异常处理的目标是让程序在出现问题时能稳住,不会直接崩溃。 1.1 异常…

linux一键部署apache脚本

分享一下自己制作的一键部署apache脚本: 脚本已和当前文章绑定,请移步下载(免费!免费!免费!) (单纯的分享!) 步骤: 将文件/内容上传到终端中 …

【Git】Git 完全指南:从入门到精通

Git 完全指南:从入门到精通 Git 是现代软件开发中最重要的版本控制工具之一,它帮助开发者高效地管理项目,支持分布式协作和版本控制。无论是个人项目还是团队开发,Git 都能提供强大的功能来跟踪、管理代码变更,并保障…

【论文复现】ViT:对图片进行分类

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ ViT:对图片进行分类 概述模型结构模型总体框架Patch_embedTransformer EncoderMLP Head 演示效果核心逻辑部署方式参考文献 概述…

git 清除旧历史提交记录并关联远程仓库

1. git checkout --orphan 临时分支名 (切换到临时分支) 2. git add -A(添加所有文件) 3. git commit -am "init"(提交更改) 4. git branch -D master(删除旧的分支) …