2008-09-28 22 views
63

के लिए संकलन करते समय एक्सकोड द्वारा क्या # डिफाइन स्थापित किए जाते हैं, मैं कुछ अर्ध-पोर्टेबल कोड लिख रहा हूं और जब मैं आईफोन के लिए संकलन कर रहा हूं तो पता लगाने में सक्षम होना चाहता हूं। तो मुझे #ifdef IPHONE_SDK... जैसे कुछ चाहिए।आईफोन

संभवतः एक्सकोड कुछ परिभाषित करता है, लेकिन मैं प्रोजेक्ट गुणों के तहत कुछ भी नहीं देख सकता, और Google बहुत मदद नहीं करता है।

उत्तर

111

यह नीचे "स्रोत कोड सशर्त संकलन"

प्रासंगिक परिभाषाएं दी गई हैं TARGET_OS_IPHONE एसडीके डॉक्स में है (और वह TARGET_IPHONE_SIMULATOR हटा दिया गया), जो आईओएस ढांचे के भीतर /usr/include/TargetConditionals.h में परिभाषित कर रहे हैं। toolchain के पिछले संस्करणों पर, आप लिखना पड़ा:

#include "TargetConditionals.h" 

लेकिन यह वर्तमान (Xcode 6/iOS8) toolchain पर नहीं रह गया है आवश्यक है।

तो, उदाहरण के लिए, यदि आप केवल कोड का एक खंड संकलित करने के लिए चाहते हैं, तो आप इस उपकरण के लिए निर्माण कर रहे हैं, तो आपको क्या करना चाहिए

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

लक्ष्य सशर्त, बिल्कुल सही बात है, तो #ifdef TARGET_OS_IPHONE – kritzikratzi

+3

@kritzikratzi का उपयोग कर रहा है जिनमें शामिल हैं: #ifdef है गलत; आपको #if का उपयोग करना होगा। (सिम्युलेटर पर नहीं होने पर प्रतीक को आमतौर पर 0 के रूप में परिभाषित किया जाता है; #ifdef अभी भी सत्य होगा।) – Andrew

+2

आप में से उन लोगों के लिए जिन्होंने यह भी सोचा कि TARGET_OS_IPHONE डिवाइस का पता लगाने का एक तरीका है, ऐसा नहीं है। इसका मतलब है कि आप आईओएस पर हैं, सिम्युलेटर या आईफोन हो सकते हैं। TARGET_IPHONE_SIMULATOR डिवाइस बनाम सिम्युलेटर का पता लगाने का तरीका है। (मुझे पता है कि यह जवाब में उल्लिखित नहीं है लेकिन आईफोन को देखकर मेरी गलती होती है) –

24

, सभी परिभाषित मैक्रो को देखने के लिए इस जोड़ने के लिए अपने निर्माण config "अन्य सी झंडे":

-g3 -save-temps -dD 

आप कुछ निर्माण त्रुटियां मिलेंगी, लेकिन संकलक अपने प्रोजेक्ट की रूट निर्देशिका में .mi फाइलों में सभी परिभाषित करता है डंप हो जाएगा। आप उदाहरण के लिए, उन पर देखने के लिए ग्रेप का उपयोग कर सकते हैं:

grep define main.mi 

जब आप पूरा कर, निर्माण सेटिंग से इन विकल्पों को दूर करने के लिए मत भूलना।

+0

धन्यवाद, यह उपयोगी था –

+0

बहुत बढ़िया! उसके लिए धन्यवाद। –

+4

ध्यान दें कि यह एलएलवीएम कंपाइलर –

0

इस प्रश्न का उत्तर काफी सही नहीं है। मंच और हार्डवेयर बनाम सिम्युलेटर का सवाल ऑर्थोगोनल है।

प्लेटफ़ॉर्म या सिम्युलेटर पहचान के लिए शॉर्टकट के रूप में आर्किटेक्चर का उपयोग न करें! इस तरह की मैला सोच ने कई वर्षों से कई प्रोग्रामरों को दिल की धड़कन और सिरदर्द का एक बड़ा सौदा किया है।

यहां सशर्तों का एएससीआईआई चार्ट है। नाम आवश्यक रूप से ऐतिहासिक कारणों से मतलब नहीं है:

+--------------------------------------+ 
|    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 (उपकरणों & सिमुलेटर)


TARGET_OS_IOS केवल iOS (उपकरणों & सिमुलेटर) के लिए सच है आईओएस, watchOS, और tvOS के लिए सच है

TARGET_OS_WATCH केवल वॉचोज़ के लिए सत्य है (डिवाइस & सिमुलेटर)

TARGET_OS_TV केवल tvOS (उपकरणों & सिमुलेटर)


TARGET_OS_EMBEDDED केवल iOS/watchOS/tvOS हार्डवेयर के लिए

TARGET_OS_SIMULATOR केवल सिम्युलेटर के लिए सच है सच है के लिए सच है।


मैं यह भी ध्यान रखें चल जाएगा कि आप मंच द्वारा xcconfig फ़ाइलों में सेटिंग्स conditionalize कर सकते हैं:

//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*] = ...