« 32 位 handle 的一种生成方法 | 返回首页 | Ant 引擎的一些改进计划 »

一个简单的 C 模块管理器

我在用 C 构建项目,尤其是和 Lua 混合使用时,一直很头疼 C 没有一个统一的模块管理器。Lua 的模块管理虽然简单,但毕竟有且够用。一种方法是把 C 模块封装成一个个 Lua 模块,让 Lua 帮助管理,每个 C 模块是独立的,相互不可见。

但当 C 模块之间发生关系时,就比较麻烦。当然,简单的方法是通过链接器把它们都链接在一起,通过函数名前缀以区分。或是利用操作系统的动态库加载器来管理模块。

最近有了一点有趣的想法,觉得一个最简的模块管理器其实复杂度并不高。花了半天功夫实现了一下,感觉还不错。

https://github.com/cloudwu/cmod/

我在设计时,刻意回避了使用 macro 魔法,让它的接口保持原始的 C 风格。而且,实现上也不依赖任何内存分配函数,整个管理器需要的内存是一开始由调用者分配好一大块传入的。

这个管理器只管理函数指针,刻意没有去管理其它状态(比如类似事务、COM 管理的就不只是函数接口,还保留对象实例),但还是为每个管理器实例留有一个 userdata 指针,供使用者扩展。


其中的 import 函数,也就是通过字符串查找对应的模块,使用的是简单的 O(n) 遍历所有已注册模块的算法。如果接下来有性能需要的话,我会再加一个 hash 表做一些简单的 cache 。

Comments

楼下说的;),为啥有太多经典源码,无非是后来的人有好奇心再造一个

几十年的c语言大佬还在做这么基础的工作,c语言模块管理太多经典源码了,vlc asterisk ffmpeg qtcreator freswitch 太多太多了

Post a comment

非这个主题相关的留言请到:留言本