博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
封装自己的库
阅读量:5343 次
发布时间:2019-06-15

本文共 1621 字,大约阅读时间需要 5 分钟。

“不要重复造车轮”,这是程序界的经典名言。有很多代码,都有重复使用的可能。如果将这些代码积累起来,形成自己的代码库,那么,日子一久,这个代码库就是一笔财富。当需要其中某个功能的时候,把以前的代码拿出来直接用就是了。这样,不仅提高了工作效率,同时还可以防止重新编码带来的错误,因为代码库里的代码在以前一定是经过严密测试的。

那么,如果积累自己的代码库呢?这里可是仁者见仁,智者见智。对于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.         #include 
3. #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组件。

转载于:https://www.cnblogs.com/foundwant/p/3214823.html

你可能感兴趣的文章
C语言_第五章__实践(密码转换)
查看>>
docker 容器后台运行命令
查看>>
jquery 获取css position的值
查看>>
面向对象的程序设计
查看>>
a标签添加点击事件
查看>>
curl 同时发送多个请求
查看>>
操纵元
查看>>
redis&rabbitMQ安装
查看>>
ubuntu下安装wine并运行source insight
查看>>
IPC介绍
查看>>
iOS-tableView会卡顿
查看>>
codefoeces-1000E We Need More Bosses(tarjan+最长链)
查看>>
Asp.net 在三层架构中事务的使用
查看>>
[BZOJ3054] Rainbow的信号(考虑位运算 + DP?)
查看>>
延迟加载与延迟求值查询
查看>>
random模块常用功能
查看>>
hdu 1698 Just a Hook
查看>>
数据库与python的连接
查看>>
glib wpa_supplicant Unix上库编译错误解决与总结
查看>>
SQL Server提高并发查询效率
查看>>