C++的可移植性及跨平台开发.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C++的可移植性和跨平台开发转载自:/program_think/article/details/3853394C++的可移植性和跨平台开发1C++的可移植性和跨平台开发[0]:概述2C++的可移植性和跨平台开发[1]:编译器3C++的可移植性和跨平台开发[2]:语法4C++的可移植性和跨平台开发[3]:异常处理8C++的可移植性和跨平台开发[4]:硬件体系相关9C++的可移植性和跨平台开发[5]:操作系统10C++的可移植性和跨平台开发[6]:多线程12C++的可移植性和跨平台开发[0]:概述今天聊聊C++的可移植性问题。如果你平时使用C++进行开发,并且你对C++的可移植性问题不是非常清楚,那么我建议你看看这个系列。即使你目前没有跨平台开发的需要,了解可移植性方面的知识对你还是很有帮助的。  C++的可移植性这个话题很大,包括了编译器、操作系统、硬件体系等很多方面,每一个方面都有很多内容。鉴于本人能力、精力都有限,只能介绍每一个方面最容易碰到的问题,供大伙儿参考。  后面我会分别从编译器、C++语法、操作系统、第三方库、辅助工具、开发流程等方面进行介绍。  为了方便阅读,把本系列帖子的目录整理如下:  1、编译器  2、语法  3、异常处理  4、硬件体系  5、操作系统  6、多线程  7、多进程  8、......C++的可移植性和跨平台开发[1]:编译器在跨平台的开发过程中,很多问题都和编译器有关。因此我们先来聊聊编译器相关的问题。  ★编译器的选择  首先,GCC是优先要考虑支持的,因为几乎所有操作系统平台都有GCC可用。它基本上成了一个通用的编译器了。如果你的代码在A平台的GCC能够编译通过,之后拿到B平台用类似版本的GCC编译,一般也不会有太大问题。因此GCC是肯定要考虑支持的。  其次,要考虑是否支持本地编译器。所谓本地编译器就是操作系统厂商自产的编译器。例如相对于Windows的本地编译器就是Visual C++。相对于Solaris的本地编译器就是SUN的CC。如果你对性能比较敏感或者想用到某些本地编译器的高级功能,可能就得考虑在支持GCC的同时也支持本地编译器。  ★编译警告  编译器是程序员的朋友,很多潜在的问题(包括可移植性),编译器都是可以发现并给出警告的,如果你平时注意这些警告信息,可以减少很多麻烦。因此我强烈建议:1把编译器的警告级别调高;2不要轻易忽略编译器的警告信息。  ★交叉编译器  交叉编译器的定义参见“维基百科”。 通俗地说,就是在A平台上编译出运行在B平台上的二进制程序。假设你要开发的应用是运行在Solaris上,但是你手头没有能够运行Solaris的 SPARC机器,这时候交叉编译器就可以派上用场了。一般情况下都使用GCC来制作一个交叉编译器,限于篇幅,这里就不深入聊了。有兴趣的同学可以参见“这里”。  关于编译器的话题,暂时聊到这,后面聊聊关于“语法”的问题。C++的可移植性和跨平台开发[2]:语法目前还有相当一部分开发人员在使用老式编译器干活,这些老式编译器可能对C++98支持不够。因此,当你的代码移植到这些老式的编译器上时,可能会碰到一些稀奇古怪的问题(包括编译出错和运行时错误)。下面这些注意事项有助于你绕过这些问题。  强调一下,后面提到的好几个条款都是通过回避C++的新语法来保证移植性。如果你用的是新式编译器,那么你可以不理会这些条款。  ★小心for循环变量的作用域(不支持新标准)  在C++98标准中,for循环变量的作用域局限在循环体内。而某些老的编译器(例如Visual C++ 6)认为for循环变量的作用域在循环体外。所以如下的代码可能导致移植问题。{ for(int i=0; iXX; i++) { // ... } for(int i=0; iXXX; i++) { // ... }}建议修改为不同的循环变量,如下所示:{ for(int i=0; iXX; i++) { // ... } for(int j=0; jXXX; j++) { // ... }}  ★不要使用全局类对象,改用单键(标准未定义)  全局类对象的构造函数先于main()函数执行,如果某个模块中同时包含若干个全局类对象,则它们的构造函数的调用顺序是不确定的。而单键是在第一次调用时被初始化,能避免此问题。另外,单键虽然解决了构造问题,但是析构依然有隐患。详见“C++ 对象是怎么死的?进程篇”。  ★保持inline函数尽量简单  不要在inline函数内部使用局部静态变量,不要在inline函数使用可变参数。这些都有可能导致移植问题。  ★不要依赖函数参数的求值顺序(标准未定义)  标准没有明确规定函数参数的求值顺序。因此,如下的代码行

文档评论(0)

kehan123 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档