“不要重复造车轮”,这是程序界的经典名言。有很多代码,都有重复使用的可能。如果将这些代码积累起来,形成自己的代码库,那么,日子一久,这个代码库就是一笔财富。当需要其中某个功能的时候,把以前的代码拿出来直接用就是了。这样,不仅提高了工作效率,同时还可以防止重新编码带来的错误,因为代码库里的代码在以前一定是经过严密测试的。
那么,如果积累自己的代码库呢?这里可是仁者见仁,智者见智。对于C++程序员,封装成库无疑是最好的选择。但库分静态库和动态库,他们各有千秋,不分仲伯。
静态库适用于封装比较短小精悍的功能,而且被其他程序调用时,适合编译到最终的可执行文件里去,而不是“裸露”到外面成为单独一个文件,随安装包一起发行。所以,静态库使得程序的发行更为方便。另一方面,静态库的调用只需要包含头文件和链接静态库,然后就可以直接使用头文件里的封装类了。
动态库适用于把某个方面的多个功能一同封装到一个库里。Windows的API函数就是封装在三个(Kenerl.dll, GDI32.dll, User32.dll)动态链接库里的。动态链接库在程序发行时,要随安装包一起发行。
下面先来看在VC++6.0里如何封装一个静态库。
1、创建静态库
这个静态库将一个内存池类封装起来。
(1)、新建一个静态库项目wsMemPool,如下图:
注意,工程类型要选Win32 Static Library,表示静态库项目。
(2)、假如我们已经写好了CMemPool类,现在将类的头文件和源文件拷贝到当前工程所在的磁盘目录,然后通过菜单“Project”-〉“Add To Project”-〉“Files”添加到项目里。最后项目的文件视图如下:
(3)、编译,生成了静态库文件wsMemPool.lib。
2、测试静态库。
现在假设有一个项目,要用到内存池,那么刚才的静态库就可以有用武之地了。
(1)、新建一个控制台的测试项目Test,如下图:
单击“OK”,然后选择“A simple application”这种控制台类型。
(2)、将刚才的静态库wsMemPool.lib文件和内存池类的头文件MemPool.h拷贝到Test工程的目录下。然后在Test.cpp里调用静态库:
1. #include "stdafx.h"2. #include3. #include "MemPool.h"4. #pragma comment(lib, "wsMemPool.lib") 5. int main(int argc, char* argv[])6. {7. CMemPool obj;8. obj.SetBufferSize(1024);9. char * pszMem = (char *)obj.AllocateBuffer();10. strcpy(pszMem, "我是一个帅哥!\n");11. printf(pszMem);12. obj.ReleaseBuffer(pszMem); 13. return 0;14. }
第3行就是包含静态库的头文件,以便程序调用里面的类。第4行就是要求程序链接静态库,这样最后的可执行程序就不在需要lib文件随安装包一起发布了。
(3)、程序运行结构如下:
从例子可以看出,静态库的调用非常简单。不过C++的静态库文件不方便被其他语言调用。如果封住的功能需要被其他语言调用,最好以API函数的形式封装成动态库,甚至COM组件。