程序可移植性

sma*_*llB 15 c++ portability

如何确保我的程序完全可移植?

Lou*_*nco 22

在所有目标平台上持续集成.

  • 这个.在我们的办公室,我们在Ubuntu(i386和x86_64),Mac OS 10.4(ppc和Intel),10.5(英特尔),10.6(英特尔),Windows XP,Windows Vista和Windows 7上都有哈德逊节点.每一个推送到祝福大师git repo在所有平台上触发构建,并在所有平台上运行单元测试. (4认同)
  • 这不一定(必然)导致"完全可移植"的代码.它产生特定于平台的代码,该代码特定于大量平台.无论"完全可移植"意味着什么,并且可能有一些争论,它并不意味着"在我的目标平台列表上工作". (4认同)

Ste*_*sop 13

1.测试

这是做必要事情的必要但不充分的条件.要测试可移植性,您需要多个平台和编译器.

2.写入标准,而不是写入您的开发平台.

这意味着,只有在标准表明你能做到的时候才能做某事.如果标准表明你可以期待它,那么只期望一个特定的结果.仅在标准表明存在时才使用库或API.该标准可在此处获取(以及其他地方):

http://openassist.googlecode.com/files/C%2B%2B%20Standard%20-%20ANSI%20ISO%20IEC%2014882%202003.pdf

如果您认为:

  • CHAR_BIT等于9.
  • sizeof(int)等于5并且int是37位类型.或16位类型.
  • 基本字符集是EBCDIC.
  • 这个时代始于1721年.
  • time_tdouble

等等.我并不是说,编写依赖于那些事情的代码是真的,我的意思是编写代码,如果它们是可行的,并且也将在一个理智的实现上工作.

3.使用您可以找到的最严格和最迂腐的编译器选项,

这是给自己一个合理的实现机会的唯一实用方法(1).

4.理解"真正的编译器"无法正确或完全实现标准,并对此事实做出一些让步.

从理论上讲,使用C++程序并不是不可移植的export.如果它在所有其他方面都是一个非常好的C++程序,那么它将适用于任何符合标准的C++编译器.但几乎没有人使用符合标准的C++编译器,所以你需要坚持使用事实上常见的C++子集.

5.了解C++标准提供了相当受限的编程环境

某些东西在标准C++中不可移植,例如在屏幕上绘制图形,因为标准C++没有图形或GUI API.因此,没有用C++编写的"完全可移植"的GUI程序.因此,根据您的计划应该做什么,您可能需要也可能不需要修改目标.

如果你的程序需要一些完全不能在标准C++中完成的东西,那么你可以通过在你认为应该在你关心的所有平台上实现的接口中封装该行为来使程序更容易移植.然后设置为每个实现它.但这并不会产生"完全可移植"的程序,因为对我而言,这意味着一个程序可以在任何符合要求的C++实现上编译和运行.一个可以通过C++编译器移植到大多数平台的程序,假设它们有一个屏幕和一个鼠标,并且有一些定制的编程工作,可能不是一回事.

当然,所有这些都可以走得太远.您可能实际上想要假设CHAR_BIT是8(否则读取文件是疯狂的),甚至可能依赖于像Qt这样的GUI框架.但你确实说过,"完全可移植",编写便携式程序需要做的主要事情之一就是找出你愿意"完全"妥协的程度.

6.断言你的假设

如果可以的话,在编译时,或者运行时,确保如果你的程序要求int至少为32位(或者其他),那么当它不是时,它会失败.好的,如此全面的测试覆盖会遇到你的算法无声地溢出并给出错误答案的情况,但很难编写真正全面的测试,无论如何测试可能会产生与代码相同的非可移植错误,或者一些可怜的傻逼者已下载您的代码可能无法正常运行它们.

使用库时,您实际上是在自动执行此操作.您将获得#include一些标题,如果库不可用则会立即失败.至少,你希望它会 - 可以想象,其他一些实现可能有一个同名的标题,它做了一些根本或微妙的不同.激进差异通常会导致编译失败,您可以测试预处理器符号以识别实现的细微差别.


rub*_*ots 12

你的问题:

如何确保我的程序完全可移植?

无法满意地回答.在任何实际应用中,您都不能确保它是可移植的.您只能通过对目标平台上的应用程序进行准确测试来证明您的期望,正如Lou Franco已经提出的那样.

在不同平台或环境下并行开发和测试的过程中,我们每个人都找到了他的技巧,并探讨了他的一些陷阱.您在一个评论中说过,您在Windows系统上工作.这可以.尝试让您的程序使用Visual Studio编译器(和环境).然后,使用GCC 4.x编译器套件安装CygWin.安装Netbeans IDE和C++环境并基于相同的源创建项目.Netbeans将使用Cygwin GCC 4.x. 如果您编译的程序适用于两个工具链,那么您可能掌握了大约90%的实际可移植性障碍.

问候

RBO


Fed*_*oca 10

避免使用特定于平台的库.


dir*_*tly 8

  • 使其符合标准.至少是您打算在其上部署应用程序的所有平台上的供应商实现的标准的公共子集.

  • 从平台无关的部分中分析出平台特定部分.通常,最低层或两层应该处理平台.

  • 及时了解以下变化:

    • 平台/ OS API
    • 工具链
    • 语言功能
  • 测试,部署.冲洗并重复.