C 语言的模块化设计和面向对象编程 分类: C 面向对象/C++/Java2011-03-02 21:04 108人阅读 评论(0) 收藏 举报 来自网易杭州研发技术总监“云风”BLO G 的几篇面向对象设计的文章 C 语言对模块化支持的欠缺 继续昨天的话题
随便列些以后成书可能会写的东西
既然书的主题是:怎样构建一个(稍具规模的)软件
且我选择用 C 为实现工具来做这件事情
就不得不谈语言还没有提供给我们的东西
模块化是最高原则之一(在 《Unix 编程艺术》一书中, Unix 哲学第一条即:模块原则),我们就当考虑如何简洁明快的使用 C 语言实现模块化
除开 C/C++ ,在其它现在流行的开发语言中,缺少标准化的模块管理机制是很难想象的
但这也是 C 语言本身的设计哲学决定的:把尽可能多的可能性留给程序员
根据实际的系统,实际的需要去定制自己需要的东西
对于巨型的系统(比如 Windows 这样的操作系统),一般会考虑使用一种二进制级的模块化方案
由模块自己提供元信息,或是使用统一的管理方案(比如注册表)
稍小一点的系统(我们通常开发接触到的),则会考虑轻量一些的源码级方案
首先要考虑的往往是模块的依赖关系和初始化过程
依赖关系可以放由链接器或加载器来解决
尤其在使用 C 语言时,简单的静态库或动态库,都不太会引起大的麻烦
C++ 则不然,C++ 的某些特性(比如模板类静态成员的构造)必须对早期只供 C 语言使用的链接器做一些增强
即使是精心编写的 C++ 库,也有可能出现一些意外的 bug
这些 bug 往往需要对编译,链接,加载过程很深刻的理解,才能查出来
注:我并不想以此来反对使用 C++ 做开发
我们需要着重管理的,是模块的初始化过程
对于打包在一起的一个库(例如 glibc ,或是 msvcrt ),会在加载时有初始化入口,以及卸载时有结束代