在为iPhone编译时,Xcode设置了哪些#defines

时间:2008-09-28 23:25:34

标签: ios xcode macos conditional-compilation

我正在编写一些半便携式代码,希望能够检测到我在为iPhone编译时的情况。所以我想要像#ifdef IPHONE_SDK...这样的东西。

据推测,Xcode定义了一些东西,但是在项目属性下我看不到任何东西,谷歌也没什么帮助。

3 个答案:

答案 0 :(得分:112)

它位于“有条件地编译源代码”

下的SDK文档中

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

#include "TargetConditionals.h"

但是当前(xCode 6 / iOS8)工具链不再需要这样做。

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

#if !(TARGET_OS_SIMULATOR)
...
#endif

答案 1 :(得分:24)

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

-g3 -save-temps -dD

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

grep define main.mi 

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

答案 2 :(得分:1)

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

不要将架构作为平台或模拟器检测的捷径!这种邋thinking的思维导致许多程序员多年来一直心痛和头疼。

这是条件的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*] = ...