67

我正在编写一些半便携式代码,并希望能够检测我何时为 iPhone 编译。所以我想要类似的东西#ifdef IPHONE_SDK...

大概Xcode定义了一些东西,但我在项目属性下看不到任何东西,谷歌也没有太大帮助。

4

3 回答 3

116

它位于“有条件地编译源代码”下的 SDK 文档中

相关的定义是TARGET_OS_IPHONE(他弃用了TARGET_IPHONE_SIMULATOR),在iOS框架内的/usr/include/TargetConditionals.h中定义。在工具链的早期版本中,您必须编写:

#include "TargetConditionals.h"

但这在当前(xCode 6/iOS8)工具链上不再需要。

因此,例如,如果您在为设备构建时只想编译一段代码,那么您应该这样做

#if !(TARGET_OS_SIMULATOR)
...
#endif
于 2008-09-28T23:47:20.047 回答
24

要查看所有定义的宏,请将其添加到构建配置的“其他 C 标志”中:

-g3 -save-temps -dD

您会遇到一些构建错误,但编译器会将所有定义转储到项目根目录中的 .mi 文件中。您可以使用 grep 来查看它们,例如:

grep define main.mi 

完成后,不要忘记从构建设置中删除这些选项。

于 2008-10-06T06:01:21.123 回答
2

这个问题的答案并不完全正确。平台和硬件与模拟器的问题是正交的。

不要将架构用作平台或模拟器检测的捷径!多年来,这种草率的想法让很多很多程序员都感到非常头疼和头痛。

这是条件句的 ASCII 图表。由于历史原因,这些名称不一定有意义:

+--------------------------------------+
|             TARGET_OS_MAC            |
| +---+  +---------------------------+ |
| |   |  |      TARGET_OS_IPHONE     | |
| |OSX|  | +-----+ +----+ +-------+  | |
| |   |  | | IOS | | TV | | WATCH |  | |
| |   |  | +-----+ +----+ +-------+  | |
| +---+  +---------------------------+ |
+--------------------------------------+

Devices:      TARGET_OS_EMBEDDED
Simulators:   TARGET_OS_SIMULATOR

TARGET_OS_MAC 适用于所有 Apple 平台。


TARGET_OS_OSX 仅适用于 macOS

TARGET_OS_IPHONE 适用于 iOS、watchOS 和 tvOS(设备和模拟器)


TARGET_OS_IOS 仅适用于 iOS(设备和模拟器)

TARGET_OS_WATCH 仅适用于 watchOS(设备和模拟器)

TARGET_OS_TV 仅适用于 tvOS(设备和模拟器)


TARGET_OS_EMBEDDED 仅适用于 iOS/watchOS/tvOS 硬件

TARGET_OS_SIMULATOR 仅适用于模拟器。


我还要注意,您可以xcconfig按平台对文件中的设置进行条件化:

//macOS only
SOME_SETTING[sdk=macosx] = ...

//iOS (device & simulator)
SOME_SETTING[sdk=iphone*] = ...
//iOS (device)
SOME_SETTING[sdk=iphoneos*] = ...
//iOS (simulator)
SOME_SETTING[sdk=iphonesimulator*] = ...

//watchOS (device & simulator)
SOME_SETTING[sdk=watch*] = ...
//watchOS (device)
SOME_SETTING[sdk=watchos*] = ...
//watchOS (simulator)
SOME_SETTING[sdk=watchsimulator*] = ...

//tvOS (device & simulator)
SOME_SETTING[sdk=appletv*] = ...
//tvOS (device)
SOME_SETTING[sdk=appletvos*] = ...
//tvOS (simulator)
SOME_SETTING[sdk=appletvsimulator*] = ...

// iOS, tvOS, or watchOS Simulator
SOME_SETTING[sdk=embeddedsimulator*] = ...
于 2017-09-14T20:13:48.590 回答