我正在編寫一些半可移植的代碼,並希望能夠檢測到我編譯iPhone時的情況。所以我想要類似#ifdef IPHONE_SDK...
。當編譯iPhone時,由Xcode設置了什麼#defines
大概Xcode定義了一些東西,但我在項目屬性下看不到任何東西,而Google沒有太多幫助。
我正在編寫一些半可移植的代碼,並希望能夠檢測到我編譯iPhone時的情況。所以我想要類似#ifdef IPHONE_SDK...
。當編譯iPhone時,由Xcode設置了什麼#defines
大概Xcode定義了一些東西,但我在項目屬性下看不到任何東西,而Google沒有太多幫助。
它在SDK文檔「有條件編譯源代碼」
相關定義TARGET_OS_IPHONE下(他不贊成TARGET_IPHONE_SIMULATOR),這是在/usr/include/TargetConditionals.h iOS的框架內定義。在早期版本的工具鏈,你必須寫:
#include "TargetConditionals.h"
但這不再需要對當前(的Xcode 6/iOS8上)工具鏈。
因此,舉例來說,如果你只想編譯的代碼塊,如果你正在構建的設備,那麼你應該做
#if !(TARGET_OS_SIMULATOR)
...
#endif
要查看所有定義的宏,將其添加到「其他C標誌」您的構建配置中:
-g3 -save-temps -dD
你會得到一些編譯錯誤,但是編譯器將所有的定義轉儲到項目的根目錄下的.mi文件。您可以使用grep來看看他們,例如:
grep define main.mi
當您完成後,不要忘了從構建設置除去這些選項。
此問題的答案不完全正確。平臺和硬件與模擬器的問題是正交的。
不要使用體系結構作爲平臺或模擬器檢測的快捷方式!這種草率的思維方式使得許多程序員多年來都感到非常沮喪和頭痛。
這是一個條件的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*] = ...
包括目標條件語句是完全正確的,然後使用#ifdef來TARGET_OS_IPHONE – kritzikratzi 2011-02-25 19:07:55
@kritzikratzi代碼:#ifdef是錯誤;你必須使用#if。 (當不在模擬器上時,該符號通常被定義爲0; #ifdef將仍然爲真。) – Andrew 2012-03-20 14:46:09