交叉兼容/平台C ++

时间:2014-03-01 05:12:40

标签: c++ c windows macos cross-platform

我在Arch Linux下工作并使用GCC作为我的编译器。我想知道,如果我想制作一个交叉兼容的程序 - 现在我不是在谈论一个基于gui的程序 - 我只是问一般。如何在Linux,Mac Osx和Windows中同时实现交叉兼容的结构,如windows.h?

2 个答案:

答案 0 :(得分:0)

就像<windows.h>这样的事情而言 - 你没有。或者至少,你尽量不去。

如果你最终需要使用GUI,你会想要跨平台的东西(我很确定Qt有很好的跨平台支持,wxWidgets也可能)。无论哪种方式,您的目标是尽可能多地编写标准C ++代码,并尽可能少地调用系统库/ API。

如果您最终需要使用系统API,请将它们包装在函数中,并在这些函数中使用#ifdef以确保您调用正确的API。通常,您的编译器将提供一些宏,使您可以在一定程度上确定正在运行的操作系统,以及32位与64位。

void DoSomething()
{
  #ifdef _WIN32
  //do Windows things here
  #endif

  #ifdef __linux__
  //do Linux things here
  #endif
}

或者:

void DoSomethingWindows()
{
  //private Windows code here
}

void DoSomethingLinux()
{
  //private Linux code here
}

void DoSomething()
{
  #ifdef _WIN32
    DoSomethingWindows();
  #endif

  #ifdef __linux__
    DoSomethingLinux()
  #endif
}

如果真的希望得到花哨,您甚至可以为特定于平台的代码设置整个标头。只需使用#ifdef来确定您的目标操作系统和#include

另外,请确保对所涉及的所有系统进行大量测试。系统API不一定在不同的操作系统中具有完美匹配,如果您对给定API的行为方式做出假设但不对其进行测试,那么您可能会遇到麻烦。

答案 1 :(得分:0)

策略可以如下:将所有特定于平台的代码封装在类和typedef中,并编写可与这些类接口一起使用的代码。这些区域通常是:文件,线程,基本类型大小。在这些类中,使用#ifdef。

编写特定于平台的代码
#ifdef _WIN32
//...
#else
//...

因此,您可以轻松添加另一个目标平台。