2010-07-03 67 views
1

当开发各种平台(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)

我应该划分什么样的定义?

+0

Windows使用'_WIN32',而不是'WIN32'。 http://msdn.microsoft.com/en-us/library/b0084kay%28VS.80%29.aspx – jamesdlin 2010-07-03 18:25:09

回答

1

Android NDK使用定义ANDROID。

4

对于iPhone,我相信这个定义是TARGET_OS_IPHONE,对于Android它是ANDROID。我对苹果专用的东西并不太熟悉,但是经过一番摸索,我发现了一大堆定义为here的操作系统的绝佳列表。这里有另一个答案SO有一个方法来拉出定义出来,发现here

+0

这很好。 定义的TARGET_OS_IPHONE和TARGET_IPHONE_SIMULATOR已存在。 >> Android的ANDROID 哦,它可以通过ANDROID定义来划分。谢谢。 – Shiva 2010-07-06 01:00:45

+1

它定义如下。 [ANDROID - >的Android] [TARGET_OS_IPHONE或TARGET_IPHONE_SIMULATOR - > iPhone/ipad公司/ iPod Touch的] [WIN32 - >窗] [当TARGET_OS_IPHONE和TARGET_IPHONE_SIMULATOR没有定义和__APPLE__定义 - >苹果] [否则 - >的Unix或Linux] – Shiva 2010-07-07 10:42:36

4

你总是可以为你的项目做一些,从而释放编译器/平台特定defines你自己。

  • 安卓#define PLATFORM_ANDROID
  • iPhone:#define PLATFORM_IPHONE

而且都建立包括定义这些宏之一在给定的项目,并且应在整个工作的一个配置文件板。如果您使用的是Visual Studio,则只需在“项目设置”中定义这些设置即可,而无需配置文件。

+2

这真的是唯一安全,干净的方法。我在几个程序中看到了替代方案(GNU屏幕是我能想到的最糟糕的),它变成了一场噩梦。更不用说,如果你的代码正在测试任何以_开头的宏定义,这个定义在C标准中没有明确定义,它没有明确的行为。 除此之外,你真的应该避免测试平台,并假设是否存在基于平台的功能。随着时间的推移平台变化很大。测试你想要使用的特定功能并且有类似'#ifdef HAVE_FOO'的东西好多了。 – 2010-07-03 10:27:33

+0

呃,呵呵。我懂了。 当像Ubuntu的Linux操作系统开发时,这种方式似乎很好。 谢谢! – Shiva 2010-07-06 01:34:15