C++跨平台代码

MBZ*_*MBZ 5 c++ cross-platform

我们将在我们的小团队中开始一个新项目:

  • 它是一个将由我们的其他项目(在Linux和Windows中)使用的库.
  • 它在逻辑上不依赖于平台(它不使用任何系统调用或类似的东西).
  • 它必须在各种平台上编译(至少包括Windows和Linux).

不幸的是,我们的开发人员没有在Windows之外的任何其他平台上编写任何代码!因此,我必须给他们一个"像这样的代码""不像这样的代码"列表,所以代码将保持跨平台.

任何指导?

小智 10

增加可移植性的一种方法是在两个平台上使用相同的编译器GCC.如果您也使用相同的编译器版本,则可能会避免大多数(如果不是全部)C++语言和标准库不兼容.您也可以使用相同的构建工具,例如GNU make,这意味着构建过程在两个平台上都是相同的.

至于平台不兼容性 - 检查他们的代码是否包含如下:

#include <windows.h>
#include <unistd.h>
#include <sys/almost_anything.h>
Run Code Online (Sandbox Code Playgroud)

除非这是通过条件编译完成的.

  • 这可能会使您的代码更容易在两个平台上运行,但它确实存在这样的危险,即您可能会因为依赖GCC中不可移植的东西而意外地使您的代码无法移植.当你来到第三个平台,你不能使用完全相同的工具时,它可能会严重咬你.不是说这是个坏主意,只要小心:) (7认同)

jco*_*der 7

确保在所有平台上都有自动构建过程,并编写单元和自动功能测试.如果可能的话,运行自动夜间构建和测试.在编写跨平台库时,这一点非常重要.

我会做其他一个答案的反面(不是我认为这是错误的,只是一种不同的方法)并且如果你可以选择你的平台使它们尽可能地不同.例如,在unix上创建一个32位MCVC和另一个64位gcc.如果您可以进行自动化测试和构建,那么这将很快显示可移植性问题.

如果可能的话,让一些开发人员在一个平台上工作而在另一个平台上工作,而不是在一个平台上完成代码,然后将其"移植"到另一个平台上.通过这种方式,当他们的同事过来抱怨他们弄坏了什么时,他们会很快学会不该做什么.

技术上要注意的事情是

  • 不要假设整数是32位
  • 不要假设char已签名或未签名
  • 不要假设字符是ASCII格式
  • 不要假设有关数据字节顺序或对齐的任何内容
  • 最小化指针算术.当你做出失败的假设时,你只会弄错.
  • 记住文件和目录名在不同平台上的工作方式不同.如果你只需要移植到windows和unix,你可能会厌倦它,但是一旦你移植到两个平台,那么下一个端口可能是z系列或VMS,这些东西的工作方式完全不同.


Mik*_*our 6

最重要的是:在所有支持的平台上运行自动构建和测试,以便立即获取大多数不可移植(或错误)的代码.

语言本身,标准库和Boost应该可以移植到任何广泛使用的平台(当然是现代版本的Linux/GCC和Windows/MSVC).怀疑任何结束的系统头文件.h,并在决定使用它们之前检查其他库的可移植性.

保存一份你遇到的所有不兼容性的文件,所以希望你只会犯下一次错误.


Col*_*nee 5

告诉他们不要使用Windows API,他们应该好好去.

我还建议增加你的警告/错误级别,如果在Visual Studio中开发,因为它会阻止你做一些gcc(通常)不允许的事情,假设你正在使用gcc来编译Linux.您还可以在项目设置中禁用Visual Studio扩展.

显然,如果有人需要使用特定于平台的东西,他们应该使用定义来替换特定于平台的代码,具体取决于它正在编译的平台.