- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
如何编写易于移植的C程序
如何编写易于移植的C++ 程序
由于操作系统的差异,同一种操作系统本身版本的差异,目前C++标准库提供的功能仍然有限以及C++编译器产品不是完全兼容等问题,使得我们在移植大型应用程序的时 候往往会出现很多难以解决的问题,如何合理的避免他们提高C++程序的移植性,本文作者从源代码的组织安排等方面提出了一些实用的 建议。
?
当我们编写服务器端的软件产品时,我们往往需要为同一个软件产品 推出多种不同平台版本。这是因为目前还没有哪个服务器操作系统可以一统天下。有不少服务器运行Windows 操作系统,但运行Linux 和各种UNIX操作系统的服务器也很多,而且各种UNIX操作系统之间又有细微的差别。另外,在一些大企业(特别是大银 行)中,运行关键业务的服务器往往是IBM 的大型机,它们的操作系统又会和一般的UNIX 有一些不同。
此外,软件依赖的中间件,调用的函数库,要求的编译器,都可看作 平台的一部分。上述内容的任意组合会造成大量的可能性。如果平台移植性做得不好,那么很可能软件在你的开发环境能正常运行,但拿到客户的环境中会出现各种 奇奇怪怪的问题。
或许你会说,这些都不是问题,用Java来写程序不就一切OK了?不幸的是,有时候一些遗产代码是用C写的,或者你必须依赖的某个关键函数库只提供了C API,经过评估又发现用Java重写,或者通过JNI以及其他可能的跨语言调用机制去封装这些遗产代码或者C API的工作量太大。那么这时候C++往往是更合适的选择。
用Java写程序可以跨平台的一大原因是Java有一个无所不包的标准库,而C++的标准库只提供了最基本的一些功能。要用C++写比较大的程序几乎一定会调用到标准库之外的API,而这些API未必可以跨平台。所以,编写易于移植的C++程序要注意的第一点是:如果能有选择,那么尽可能地使用跨平台的API。
比如,同样是对文件操作,Win 32 API 和UNIX 操作系统提供的文件操作函数各不相同,选哪个呢?都不合适,最好 还是依赖标准库,fstream或者fopen/fclose都可以。要创建线程并进行线程间同步,Win 32 API 和UNIX 的做法又不一样。有没有跨平台的解决方案呢?有的,pthreads是跨平台的。如果你的系统需要有对字符串进行操作,是用MFC提供的CString还是标准库中的string呢?显然应该选后者,因为MFC 不是跨平台的。
那么,如果你不得不用到的某些API 没有跨平台的实现,只有各个平台自己的实现,怎么办呢?举个例 子,在Windows 平台,加载动态库是调用LoadLibrary;在UNIX平台,加载动态库是调用dlopen。似乎没有什么跨平台的实现。那么我们怎么办?可不可以在每处要 加载动态库的地方都这么写?
#ifdef WIN32
HMODULE h = LoadLibrary(“libraryname”);
#elif defined(UNIX)
int h = dlopen(“libraryname”, RTLD_LAZY);
#endif
?
不少软件就 是这么做的。但这样做很糟糕,因为把平台相关代码同其他的平台独立代码混在了一起,而且代码中会散布很多的#ifdef,影响阅读;而且如果稍后需要把代码移植到另一个平台,那么可能 需要修改每一处加载动态库的地方,增加一个#elif defined(?),工作量会比较大。
推荐的做法是:自己封装一个跨平台的实现,在平台独立代码中只调 用这个跨平台的API,把平台相关性隔离出去。当然,这层封装应该是很薄的,应该只需要用一两行的inline 函数以及几个typedef 即可。这样做的指导思 想是,通过封装来增加间接层次,从而把平台独立代码和平台相关代码分离。
下面来看一下,这样做是不是可以了呢?
在main.cpp 中(假设我们需要在这个文件中加载动态库)这样写:
#include “platform_specific.hpp”
int main() {
handle_t h = MyLoadLibrary(libraryname);
// 之后使用动态库,然后卸载
}
在platform_specific.hpp 中这样写:
#ifdef WIN32
typedef HMODULE /* WIN32 handle type */ handle_t;
inline handle_t MyLoadLibrary(const string libname)
{
return LoadLibrary(libname.c_str());
}
#elif defined(UNIX)
typedef int /* UNIX handle type */ handle_t;
inline handle_t MyL
您可能关注的文档
- 大菱鲆消化酶研究现状与展望.pdf
- 大狗追着小宝宝的小手舔,还含到嘴里想咬,画面让人十分担心!.pdf
- 大西洋银行澳门币.ppt
- 大象爷爷收到的礼物.ppt
- 大跨度连续梁拱桥顶推施工力学行为分析.pdf
- 大跨径钢管拱加工与现场预拼施工03080.doc
- 大连创世第十二次股东大会资料.pdf
- 大连自清洗过滤器办事处批发价格.doc
- 大钟寺五十 道题 打印 剪裁.doc
- 大黑沙土中心校三年规划.docx
- 中考数学总复习圆点直线与圆的位置关系中考考点清单省公开课一等奖百校联赛赛课微课获奖课件.pptx
- 中考数学总复习图形的认识与三角形第21讲全等三角形省公开课一等奖百校联赛赛课微课获奖课件.pptx
- 2022年开封文化艺术职业学院招聘笔试真题附答案详解.docx
- 2022年开封职业学院招聘笔试真题及参考答案详解.docx
- 员工租用班车合同协议.docx
- 2022年开封文化艺术职业学院招聘笔试真题带答案详解.docx
- 商业综合体火灾应急预案和措施.docx
- 条件生效合同协议.docx
- 2022年开滦蔚州矿业有限责任公司校园招聘真题及答案详解1套.docx
- 2022年开滦蔚州矿业有限责任公司校园招聘真题及参考答案详解1套.docx
文档评论(0)