我正在编写一些半便携式代码,希望能够检测到我在为iPhone编译时的情况。所以我想要像#ifdef IPHONE_SDK...
这样的东西。
据推测,Xcode定义了一些东西,但是在项目属性下我看不到任何东西,谷歌也没什么帮助。
答案 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*] = ...