使用哪个条件编译来在 Mac 和 iPhone 特定代码之间切换?

2024-01-31

我正在开发一个项目,其中包括共享代码的 Mac 应用程序和 iPad 应用程序。如何使用条件编译开关从 iPhone 项目中排除 Mac 特定的代码,反之亦然?我注意到了TARGET_OS_IPHONE and TARGET_OS_MAC都是 1,所以它们总是 true。我是否可以使用另一个开关,该开关仅在针对特定目标进行编译时返回 true?

在大多数情况下,我通过移动来让文件进行合作#include <UIKit/UIKit.h> and #include <Cocoa/Cocoa.h>到两个项目的预编译头中。我正在分享模型和一些从 RSS 源和 Evernote 获取数据的实用程序代码。

特别是,[NSData dataWithContentsOfURL:options:error:]函数对选项参数 iOS 3.2 及更早版本和 Mac OS 10.5 及更早版本采用与 iOS 4 和 Mac OS 10.6 不同的常量。我使用的条件是:

#if (TARGET_OS_IPHONE && (__IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_3_2)) || (TARGET_OS_MAC && (MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5))

这似乎可行,但我想确保这是万无一失的。我的理解是,如果Mac版本设置为10.6,但iOS版本设置为3.2,即使它是针对iOS 3.2编译的,它仍然会使用新常量,这似乎不正确。

预先感谢您的任何帮助!


你的观察犯了错误。 :)

TARGET_OS_MAC构建 Mac 或 iPhone 应用程序时将为 1。你说得对,对于这种事情来说,这是毫无用处的。

然而,TARGET_OS_IPHONE构建 Mac 应用程序时为 0。我用TARGET_OS_IPHONE为此目的一直在我的标题中。

像这样:

#if TARGET_OS_IPHONE
// iOS code
#else
// OSX code
#endif

这是一个很棒的图表:http://sealiesoftware.com/blog/archive/2010/8/16/TargetConditionalsh.html http://sealiesoftware.com/blog/archive/2010/8/16/TargetConditionalsh.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用哪个条件编译来在 Mac 和 iPhone 特定代码之间切换? 的相关文章

随机推荐