【问题标题】:Macro definition in cross-platform跨平台宏定义
【发布时间】:2011-03-11 09:35:41
【问题描述】:

在开发各种平台(Android、iPhone、Mac、Windows等)时,需要根据平台定义进行分歧处理(#ifdef/#endif)。 但是,我不知道 Mac/iPhone/Android 中的原始定义。

 Windows : WIN32 (Visual C++)

 Mac : __MAC_NA(?) (XCode)

 iPhone/iPad/iPod : __IPHONE_NA(?) (XCode)

 Android : ?? (AndroidNDK)

我应该按照什么定义来划分?

【问题讨论】:

标签: c++ iphone c android macos


【解决方案1】:

对于 iPhone,我相信定义是 TARGET_OS_IPHONE,对于 Android,它是 ANDROID。我对 Apple 特定的东西不太熟悉,但是在四处寻找之后,我发现了一个很棒的列表,上面有大量的操作系统定义 here。 SO上有另一个答案,它有一种提取定义的方法,发现here

【讨论】:

  • 这很好。定义的 TARGET_OS_IPHONE 和 TARGET_IPHONE_SIMULATOR 是存在的。 >>Android 是ANDROID 哦,可以按照ANDROID 定义来划分。谢谢。
  • 它定义如下。 [ANDROID -> Android] [TARGET_OS_IPHONE 或 TARGET_IPHONE_SIMULATOR -> iPhone/iPad/iPodTouch] [WIN32 -> Windows] [当 TARGET_OS_IPHONE 和 TARGET_IPHONE_SIMULATOR 未定义且 APPLE 已定义时 -> Mac] [否则 - > Unix 或 Linux]
【解决方案2】:

您总是可以为您的项目做一些补充,从而将自己从编译器/平台特定的defines 中解脱出来。

  • 安卓:#define PLATFORM_ANDROID
  • 手机:#define PLATFORM_IPHONE

并让所有构建都包含一个配置文件,该文件在给定项目中定义这些宏之一,并且应该全面工作。如果您使用的是 Visual Studio,您可以在项目设置中定义这些,甚至不需要配置文件。

【讨论】:

  • 这确实是唯一安全、干净的方法。我已经在几个程序中看到了替代方案(GNU 屏幕是我能想到的最糟糕的),它变成了一场噩梦。更不用说,如果您的代码正在测试任何以 _ 开头且未在 C 标准中明确定义的宏定义,则它具有未指定的行为。除此之外,您确实应该避免测试平台并假设存在/不存在基于平台的功能。随着时间的推移,平台会发生很大变化。最好测试您想要使用的特定功能并使用#ifdef HAVE_FOO 之类的内容。
  • 嗯,嗯。我知道了。在像 ubuntu 这样的 linux OS 中开发时,这种方式似乎很好。谢谢!
【解决方案3】:

Android NDK 使用 ANDROID 定义。

【讨论】:

    猜你喜欢
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 2016-05-11
    • 1970-01-01
    • 2017-11-15
    • 2023-01-20
    • 1970-01-01
    相关资源
    最近更新 更多