我正在编写一些半可移植的代码,想要能够检测是否正在为iPhone编译。因此,我需要类似于#ifdef IPHONE_SDK...
的东西。
大概Xcode会定义一些东西,但我在项目属性下并没有看到任何内容,而且谷歌也没有什么帮助。
我正在编写一些半可移植的代码,想要能够检测是否正在为iPhone编译。因此,我需要类似于#ifdef IPHONE_SDK...
的东西。
大概Xcode会定义一些东西,但我在项目属性下并没有看到任何内容,而且谷歌也没有什么帮助。
这在SDK文档的“有条件地编译源代码”部分中有说明。
相关定义为TARGET_OS_IPHONE(和已弃用的TARGET_IPHONE_SIMULATOR),它们在iOS框架中的/usr/include/TargetConditionals.h中定义。在工具链的早期版本中,您需要编写:
#include "TargetConditionals.h"
但是在当前的(xCode 6/iOS8)工具链上,这已经不再必要。
因此,举个例子,如果您只想在构建设备时编译一段代码块,则应执行以下操作:
#if !(TARGET_OS_SIMULATOR)
...
#endif
想查看所有已定义的宏,请将以下内容添加到您的构建配置的“其他C标志”中:
-g3 -save-temps -dD
你可能会遇到一些构建错误,但编译器会将所有定义转储到项目根目录中的.mi文件中。你可以使用grep查看它们,例如:
您会得到一些构建错误,但编译器会将所有定义转储到项目根目录中的.mi文件中。您可以使用grep来查看它们,例如:
grep define main.mi
完成后,不要忘记从构建设置中删除这些选项。
gcc -dM -E - < /dev/null
可以更轻松地获取定义,适用于 gcc、g++、clang 和 clang++。 - Urkle+--------------------------------------+
| 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*] = ...
TargetConditionals.h
。 - Sebastian