Xcode编译iPhone时设置了什么#defines

我正在写一些半可移植的代码,并希望能够检测到我编译的iPhone。 所以我想要像#ifdef IPHONE_SDK...

大概Xcode定义了一些东西,但是在项目属性下我看不到任何东西,Google也没什么帮助。

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

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

 #include "TargetConditionals.h" 

但是对于当前的(xCode 6 / iOS8)工具链,这已经不再需要了。

所以,举个例子,如果你只想编译一个代码块,如果你正在构build设备,那么你应该这样做

 #if !(TARGET_OS_SIMULATOR) ... #endif 

要查看所有已定义的macros,请将其添加到您的构buildconfiguration的“其他C标志”中:

 -g3 -save-temps -dD 

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

 grep define main.mi 

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

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

不要使用架构作为平台或模拟器检测的捷径! 这种草率的思维方式使得很多程序员多年来都感到非常沮丧和头痛。

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

 +--------------------------------------+ | TARGET_OS_MAC | | +---+ +---------------------------+ | | | | | TARGET_OS_IPHONE | | | |OSX| | +-----+ +----+ +-------+ | | | | | | | IOS | | TV | | WATCH | | | | | | | +-----+ +----+ +-------+ | | | +---+ +---------------------------+ | +--------------------------------------+ Devices: TARGET_OS_EMBEDDED Simulators: TARGET_OS_SIMULATOR 

TARGET_OS_MAC适用于所有苹果平台。


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*] = ...