我正在编写一些半便携式代码,希望能够检测到我在为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查看它们,例如:

grep define main.mi 

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

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

不要将架构作为平台或模拟器检测的捷径!这种邋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*] = ...
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top