
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
模块化编程开发是目前大多数软件开发程序员都在学习与应用的一种编程开发技术,而本文我们就通过案例分析来简单了解一下,模块化编程开发需要注意哪些问题。
模块
先定义下模块的概念,在C++中可以认为每个二进制文件为一个模块。比如一个exe可执行程序、一个dll或so动态库。通常来说一个exe会依赖于几个dll动态库。
我们写一个带界面的聊天程序,exe为入口主程序是主模块,它可能依赖于QtWidgetsQtCore等Qt模块、libevent三方模块、我们自己写的基础库xxbase模块。
接口/跨模块接口
模块自己内部调用比较简单,因为编译环境和平台都一致,不存在不兼容的问题。如果想把我们的功能提供给其他人使用,就需要导出接口和dll二进制文件了。每种语言有自己的接口定义形式,接口在C或C++里就是一些.h头文件。头文件里定义了结构体、函数等,供其他模块调用。
也可以认为模块由接口和二进制文件组成。windows编译出来的dll肯定不能在linux上调用、32位编译出的dll又不能被64位程序调用、Debug模式和Release模式也存在很多差异。C++不像Java,Java是编译一次在任意操作系统和平台都能跑起来。C++呢?不同操作系统、不同CPU、不同系统位数、甚至不同优化参数,编译出来的二进制文件都不通用。
动态库
动态库就是编译好的、可供其他模块调用的二进制文件。在windows是dll形式,在类Unix是so形式。
动态库相比源码和静态库有以下优势:
若以源码或静态库方式提供给别人用,如果后期有一个bug需要修改,那么所有调用者都需要重新编译、测试、打包发布,成本很高。
以动态库方式提供,使用者只需要替换dll或so即可,简单高效。
动态库的劣势:
动态库版本维护比较麻烦,得思考下如何避免“dll地狱”。
跨模块接口编写规范
跨平台的接口应该使用C++11新统一的数据类型,比如int32_tint64_t等。因为原始类型在不同平台编译器可能位数不同,比如long有的是32位、有的是64位。
不能使用STL标准库里的vector、list等作为函数参数。因为模块提供者和使用者可能使用不同的C++编译器,STL实现方式不一样。
只能传递裸指针作为函数参数,不能使用智能指针。因为不确定调用者是否支持智能指针、智能指针实现方式是否一样。
接口一经发布,不允许做任何修改(.h不能改、只允许改.cpp发布dll更新版本)。因为修改接口后所有使用者都要重新编译,即使用不到新增的功能。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。