2008-09-28 123 views

回答

111

它在SDK文檔「有條件編譯源代碼」

相關定義TARGET_OS_IPHONE下(他不贊成TARGET_IPHONE_SIMULATOR),這是在/usr/include/TargetConditionals.h iOS的框架內定義。在早期版本的工具鏈,你必須寫:

#include "TargetConditionals.h" 

但這不再需要對當前(的Xcode 6/iOS8上)工具鏈。

因此,舉例來說,如果你只想編譯的代碼塊,如果你正在構建的設備,那麼你應該做

#if !(TARGET_OS_SIMULATOR) 
... 
#endif 
+0

包括目標條件語句是完全正確的,然後使用#ifdef來TARGET_OS_IPHONE – kritzikratzi 2011-02-25 19:07:55

+3

@kritzikratzi代碼:#ifdef是錯誤;你必須使用#if。 (當不在模擬器上時,該符號通常被定義爲0; #ifdef將仍然爲真。) – Andrew 2012-03-20 14:46:09

24

要查看所有定義的宏,將其添加到「其他C標誌」您的構建配置中:

-g3 -save-temps -dD 

你會得到一些編譯錯誤,但是編譯器將所有的定義轉儲到項目的根目錄下的.mi文件。您可以使用grep來看看他們,例如:

grep define main.mi 

當您完成後,不要忘了從構建設置除去這些選項。

0

此問題的答案不完全正確。平臺和硬件與模擬器的問題是正交的。

不要使用體系結構作爲平臺或模擬器檢測的快捷方式!這種草率的思維方式使得許多程序員多年來都感到非常沮喪和頭痛。

這是一個條件的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*] = ...