如何用c ++编写可移植代码?

und*_*ack 28 c++ portability

编写可移植代码时我应该记住哪些事情?因为我是一名c ++初学者,所以我想从一开始就练习它.

谢谢.

Ale*_* C. 17

  • 学会使用标准库
  • 读书(例如本书)
  • 当你有经验的时候,学会使用助推器

  • @SigTerm:boost的主要设计目标之一是可移植性.它可以在各种各样的平台上运行,并且可以很好地消除差异.例如,线程库和文件系统库以平台无关的方式工作.其中一些内容包含在C++ 0x中. (7认同)
  • 此外,这些书籍:http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list (4认同)
  • 那么,提升与可移植性有何关系? (2认同)
  • @Sig:虽然它变得越来越相互依赖,但Boost仍然包含许多单独的库,你可以使用它们.其中一些,例如`shared_ptr`,应该是事实上的标准,除非已有内部替代品.无论如何,为什么你认为它不适合小项目?只需包含您使用的内容,如果需要分发来源,只需打包相关部分即可. (2认同)

Ben*_*igt 14

将特定于平台的代码与可重用代码分开,最好是在不同的文件中,但至少在不同的函数中.如果你开始有#if WIN32#if CYGWIN#if BSD所有的地方,你将有一个维护的噩梦.

然后,尽早并经常在至少两个不同的平台上进行编译.典型的选择是Windows上的Visual C++和Linux上的gcc.由于系统库和编译器都不是共享的,因此在它们在您的设计中根深蒂固之前,您将捕获非可移植代码.

  • 使用Hudson之类的东西自动化您的构建,Hudson将构建为(安装/每日/在CVS签入等)和电子邮件(如果构建失败).您可以在一台PC上使用虚拟机和buidl,例如Windows和Linux (2认同)

Sig*_*erm 13

编写可移植代码时我应该记住哪些事情?

  1. 在附近保留几个编译器,在目标平台上定期测试代码.如果你正在为windows windows/linux做跨平台软件,请保持mingw,visual studio express(即"microsoft compiler")和使用g ++(或使用虚拟机)的linux安装.即使你的代码是完美的,编译器也可能有某种意想不到的怪癖.例如,某些版本的ms编译器对字符串常量的大小有限制,而gcc没有.
  2. 不要依赖标准类型的尺寸.例如,在msvc上,sizeof(wchar_t)是2个字节.在linux上安装它可以是4个字节.使用sizeof(如果需要),或者尽量避免在代码中使用任何类型的大小.并且您不应该假设指针大4个字节(将用户数据指针传递到api调用方案) - 它将是64位上的8个字节.
  3. 不要使用特定于编译器的编译指示,宏和扩展.例如,避免"#pragma once".
  4. 不要使用标准库的扩展(由编译器开发人员提供).但是,这更适用于C库函数.例如,MS编译器提供标准C样式例程的多个"安全"(如strcpy_s)版本.当然,这在其他平台上是不可用的.
  5. 如果您决定在C++代码中使用C风格的例程(如sprintf),请务必小心.(我知道它应该是一个不好的做法,但在某些情况下这很有用)它们的实现,扩展和不同数量的参数略有不同.例如,sprintf可能具有在不同平台上以不同方式实现的不同附加格式.例如,上次检查"%S"在vswprintf例程中的msvc和gcc上的行为有所不同.
  6. 不要依赖特定于编译器的数据类型,例如__int32.很可能你需要某种类型,保证长度为4个字节(或类似的东西) - 使用typedef结合条件编译("#ifdef WIN32").或使用跨平台库提供的类型.例如,SDL提供类似Uint8,Qt 4具有quint32等类型.这是非常常见的做法.
  7. 避免直接OS调用.使用标准函数访问文件.
  8. 当您必须使用特定于OS的调用时,请使用条件编译(#ifdef WIN32等)
  9. 尝试在所有平台上使用相同的构建系统.Linux上没有MSBuild.使用gnumake,cmake,scons或qmake.虽然在某些系统中你必须使用不同编译器的标志进行编码,但是可以在任何地方使用相同的脚本.例如,它与SConstructs很好地配合.为所有平台维护一个构建脚本可能比在不同构建系统之间同步更改更容易.
  10. 对于需要与操作系统交互的所有操作(Gui,文件操作),请使用跨平台库.Qt是个不错的选择.


rob*_*jam 5

编写命令行程序开始.准备好后,找到一个跨平台的窗口工具包,如Qt.

如果您对编写多语言代码感兴趣,请使用第三方unicode库(如ICU),而不是依赖于特定于平台的库.

  • ...如果你处理文本,请关注多语言. (2认同)
  • ICU是一个非常好的观点,因为C++没有真正的(Unicode感知的)字符串数据类型.在类Unix系统上,`std :: string`经常有效,在Windows上`std :: wstring`总是有效,但对于真正与OS无关的程序,你需要一个真正的字符串数据类型,如ICU的`UnicodeString`. (2认同)