使用C语言来实现模块化

除了C语言以及C++编程语言之外,在其它现在非常流行的开发语言中,比如说:java,php,jsp等等。我们很难想象到缺少标准化的模块管理机制是一件多么可怕的事情。但是这往往也是由C语言本身的设计哲学决定出来的:将尽可能多的可能性留给开发人员。然后根据实际情况的系统,根据大家的实际需要来定制一些自己所需要的东西。

  对于一些稍微小一点的系统来说(就是我们在开发过程中通常会接触到的系统),一般情况下我们都会考虑选择轻量一些的源码级方案。假如不是小的系统,相反是一些巨型系统来说(就比如说:类似Windows这样的操作系统),那么一般我们都会考虑使用一种二进制级的模块化方案。由模块它自己来提供元信息,又或者是我们还可以使用统一的管理方案(就比如说:注册表等工具)。

  但是我们首先往往要考虑到一个问题,那就是模块的初始化过程以及依赖关系这两个部分。

  1、依赖关系

  其实依赖关系这一个部分我们可以放由加载器又或者是链接器来进行解决。尤其大家在使用C语言的时候,简单的动态库或者是静态库,通通都不太会给我们引起很大的麻烦,所以大家可以非常的放心。

  但是C++编程语言却不是这样了,在C++中有某一些特性(就比如说模板类静态成员的构造)就一定要对早期只供C语言使用的链接器做一些增强。就算是一些很精心去进行编写的C++库,也有可能会出现一些意外的bug(即程序错误)。这些程序错误往往如果想要查询出来的话,往往就需要对链接,加载过程,编译有很深刻的理解,才可以查出来。在这里大家要注意一点哦,那就是小编写这一段话,并不说要根据这样来反对大家使用C++编程语言来进行开发程序。

  2、模块的初始化过程

  那么我们往往更需要着重管理的,则是模块的初始化过程这一部分。

  对于一些打包在一起的一个库(比如说:msvcrt又或者是glibc等),往往都会在加载的时候有一个初始化入口,以及卸载的时候都会有结束的代码。但是小编在这里想说的不是这一个问题,而是大家内部拆分的更小的模块的相互依赖关系。问题就是在于:究竟谁先初始化,谁后初始化呢?

  通常使用C++编程语言的朋友,都应该发现他的语言级解决方案中,经常使用到的都是单件模块。要么就是由链接器决定以怎样的一个次序来进行生成初始化代码。但是这经常就会因为实际构造次序不同以及依赖关系,从而导致了程序错误的发生(注意事项:小编在好几本关于C++书籍中都见过,待核实。其实小编自己在好久不写C++也并没有实际的错误例子出现);要么就是使用惰性初始化方案。但是大家也应该知道这个惰性初始化也不是万能钥匙来的,另外还有一些额外的开销了。所以,如果是在多线程环境中就一定要尤其需要注意这一点了。

  小编在使用C语言制作初期设计时,往往都采用一种足够简单方便的方法。这种简便的方法就是,用编码的规范来进行规定,每一个模块都一定要存在一个初始化函数,要有一个较为规范的名字。就比如说:foo模块的初始化入口叫做:int foo_init()。

  假如说大家使用了特定的模块,那么就一定要调用模块初始化函数。这是一个规定来的哟,所以大家一定要遵循咯。

  大家一定要注意一点,那就是:初始化函数是间接调用的,并不是直接调用的。这样的做法,为了要避免发生模块重复初始化的问题。就类似一下这种:mod_using(foo_init);。

  mod_using的主要作用就是:负责调用初始化函数,并且还可以保证不重复调用,另外它还可以为我们检查一下循环依赖。

  在这里的话,我们还约定了初始化是否成功就在于它的一个返回值。(一般情况下在我们的系统中,如果返回值是1的话,那就代表着失败;相反如果是0的话,那就代表着正确)然后我们再定义了一个宏来制作这个使用。如图所示:

  注意事项:就个人而言,小编是特别反对滥用宏的。所以大家也要尽可能的避免使用到宏。在这里小编使用了宏,都是经过了慎重的考虑才决定使用的。为了可以去判断一下自己究竟是否真的漏掉了模块初始化,小编却希望可以有一个代码扫描器帮我去判断(可能小编会使用了一个模块,但是却忘记了将它初始化)。宏可以帮助代码扫描分析器更加容易的实现。除此之外,使用宏的话就更加像是对编程语言做的轻微且必要的扩展。

  这样的话,小编的系统中模块模块的实现代码最后,往往都会有一个名为init的函数,在里面仅仅只是简单的调用了USING来进行引用其他的模块。就比如说下面这个示范例子,具体的程序代码如图所示:

  由于大部分的需求下是不需要模块卸载的,所以在这篇教程中小编就不再来论证这一点了。如果大家想要去了解的话,可以去查阅相关的书籍。

时间: 2024-12-11 11:31:04

使用C语言来实现模块化的相关文章

【C语言探索之旅】 第二部分第一课:模块化编程

内容简介 1.课程大纲 2.第二部分第一课: 模块化编程 3.第二部分第二课预告: 进击的指针,C语言王牌 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建你自己的变量

【C语言探索之旅】 第二部分第十课:练习题和习作

内容简介 1.课程大纲 2.第二部分第十一课:  练习题和习作 3.第三部分第一课预告:  安装SDL 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建你自己的变量类型

【C语言探索之旅】 第二部分第六课:创建你自己的变量类型

0 内容简介 1.课程大纲 2.第二部分第六课: 创建你自己的变量类型 3.第二部分第七课预告: 文件读写 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建你自己的变量

前端模块化发展简史

前端发展日新月异,短短不过 10 年已经从原始走向现代,甚至引领潮流.网站逐渐变成了互联网应用程序,代码量飞速增长,为了支撑这种需求和变化,同时兼顾代码质量.降低开发成本,接入模块化势在必行.伴随这一变化的是相对应的构建工具的快速成长,或是为了优化.或是为了转义,都离不开这类工具. 所谓温故而知新,本篇回顾总结下前端模块化的发展历程及辅助工具.在回顾中可以更清晰的看到当前我们用的方案所处的位置,为什么会发展到这一步,目前模块化方案带来的优势等. 1. 没有模块化的日子 最开始 JavaScrip

C语言程序设计-第1章 程序设计和C语言

所谓程序,就是一组计算机能识别和执行的指令. 每一条指令使计算机执行特定的操作.一个特定的指令序列,用来完成一定的功能. 计算机的本质是程序的机器,程序和指令是计算机系统中最基本的概念. 计算机能直接识别和接受的二进制代码称为机器指令(machine instruction),机器指令的集合就是该计算机的机器语言(machine language).为了克服机器语言的难学难写难记难检查难修改难推广使用的缺点,人们创造出了符号语言(symbolic language),它用一些英文字母和数字表示一

【C语言探索之旅】 第二部分第二课:进击的指针,C语言的王牌!

内容简介 1.课程大纲 2.第二部分第二课: 进击的指针,C语言的王牌 3.第二部分第三课预告: 数组 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建你自己的变量类型

【C语言探索之旅】 第二部分第三课:数组

内容简介 1.课程大纲 2.第二部分第三课: 数组 3.第二部分第四课预告:字符串 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建你自己的变量类型 文件读写 动态分配

新JVM语言比较:Ceylon vs Kotlin vs Fantom

现存的计算机编程语言有好几千种,JVM上的语言也有十几种,所以大可不必为没听说过的编程语言感到惊奇. Java的缺陷 由于工作的原因,对Java比较了解.从Java中我们总结的教训: 对象可以赋值null造成NPE 受检异常(checked exception) 属性getter,setter太烦 接口不能有实现(java8 fixed) 缺乏Lambda(java8 fixed) 方法Overloading对可读性和动态调用造成伤害. 语言层缺乏模块化支持 并发支持很糟糕 原始类型不是对象 0

【C语言探索之旅】 第一部分第六课:条件表达式

内容简介 1.课程大纲 2.第一部分第六课:条件表达式 3.第一部分第七课预告:循环语句 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建你自己的变量类型 文件读写 动