2013-04-26 9 views
41

संकलक निर्देशों का उपयोग करते समय यह मेरे लिए अस्पष्ट है कि नीचे दिए गए दो कोड स्निपेट सही/पसंदीदा हैं और क्यों। ऐसा लगता है कि मैंने देखा है कि ज्यादातर डेवलपर्स और ओपन सोर्स प्रोजेक्ट्स पहले इस्तेमाल करते हैं लेकिन मैंने दूसरे बार भी इस्तेमाल किया है।#ifdef DEBUG बनाम #if DEBUG

#ifdef DEBUG 
[self doSomethingOnlyWhenDebugging]; 
#endif 
बनाम

#if DEBUG 
[self doSomethingOnlyWhenDebugging]; 
#endif 

ऊपर कोड के टुकड़े में से कौन सा केवल जबकि डिबगिंग और क्यों कोड को चलाने के लिए बेहतर है

? मेरा अनुमान है कि अगर डीबीयूजी को सत्य या गलत के रूप में परिभाषित किया जाता है तो पहला भाग जाएगा जहां दूसरा डीबीयूजी परिभाषित किया जाएगा और सत्य पर सेट किया जाएगा। क्या वो सही है?

+9

'ifdef' बस परीक्षण किया गया है कि प्रतीक परिभाषित किया गया है।'# if' प्रतीक के VALUE का परीक्षण करता है। इसलिए '#define FOO 0' कर देगा' #ifdef FOO' सच हो, लेकिन '#if FOO' गलत हो, क्योंकि यह 0' #if' कर रहा है। –

+0

आप "रूट" परिभाषा खोजने के लिए और यह निर्धारित मूल्य एक 1/0 मूल्य या एक वर्तमान/अनुपस्थित एक हो करने का इरादा है करने का प्रयास करना चाहिए। उन्हें गलत प्राप्त करने से "अप्रत्याशित" परिणाम हो सकते हैं। –

उत्तर

35

आप सही हैं। #if DEBUG मूल्यांकन नहीं करेगा यदि DEBUG को 0 के रूप में परिभाषित किया गया है।

जब प्रत्येक का उपयोग करने के लिए के रूप में, आप कुछ भी है जहाँ आप केवल करने की जरूरत है इस तरह के डीबग लॉगिंग जोड़ने के रूप में, अगर पूर्वप्रक्रमक परिभाषा मौजूद है कोड जोड़ने के लिए #ifdef उपयोग करने के लिए छड़ी कर सकते हैं। यदि आपको मूल्य का निरीक्षण करने और विभिन्न संकलन पथों पर जाने की आवश्यकता है, तो मैं 0 या 1 का उपयोग करूंगा। इसका एक अच्छा उदाहरण TARGET_IPHONE_SIMULATOR है, जिसे हमेशा आईओएस प्रोजेक्ट के लिए परिभाषित किया जाता है, लेकिन यदि आप सिम्युलेटर के लिए संकलित कर रहे हैं तो केवल 1

+1

तो अगर मैं केवल सिम्युलेटर में कोड के कुछ लाइन पर अमल करना चाहता था, मैं 'उपयोग करने के लिए # if' क्योंकि' TARGET_IPHONE_SIMULATOR' कि क्या मैं सिम्युलेटर या नहीं पर चल रहा हूँ की परवाह किए बिना परिभाषित किया गया है की आवश्यकता होगी। सही बात? – lidsinker

+2

@lidsinker सही – Kevin

+0

अच्छी तरह से समझाया। बहुत बहुत धन्यवाद –

6

मैं जानते हैं, बेहतरीन विकल्प है:

#ifndef DEBUG 
    NSLog(@"-1"); 
#elif DEBUG == 0 
    NSLog(@"0"); 
#else 
    NSLog(@"%d", DEBUG); 
#endif 

तो, आपको पता चलेगा कि #ifndef DEBUG सब दूसरों के ऊपर वरीयता दी जाती है।

#if DEBUG == 0 // DEBUG is not defined or defined to be 0 
    // do sth 
#else 
    // do sth 
#endif 

हालांकि, अगर -Wundef संकलक झंडे पर है, वहाँ एक #if DEBUG == 0 साथ चेतावनी हो सकती है: वहाँ एक सरल विकल्प है।

1

आपको उस कोड को देखने की आवश्यकता है जहां DEBUG परिभाषित किया गया है या परिभाषित नहीं किया गया है, और तदनुसार अपना कोड लिखें। DEBUG के साथ, आप पाएंगे कि इसे या तो परिभाषित नहीं किया गया है, या 1 के मान के साथ परिभाषित किया गया है। तो #if DEBUG या #ifdef DEBUG काम करेगा।

#define की है कि अपने नियंत्रण में हैं के लिए, मैं सुझाव है कि आप हमेशा उन्हें, या तो फिर आप मूल्य के लिए जाँच करने के लिए उपयोग कर सकते हैं #if 0 या 1. के एक मूल्य के साथ परिभाषित करते हैं, लेकिन आप भी उन्हें सीधे उपयोग कर सकते हैं सामान्य अगर कथन या अभिव्यक्ति में, जो आपके कोड को और अधिक पठनीय बना सकता है। और चूंकि इसे हमेशा परिभाषित किया जाता है, इसलिए आप उस स्थान पर जाने के लिए एक्सकोड में "जंप टू डेफिनिशन" का उपयोग कर सकते हैं जहां इसे परिभाषित किया गया है और जांचें कि यह कैसे और क्यों सेट है। यदि इसके बजाय आप या तो #define या #define मान नहीं हैं, और यह परिभाषित नहीं किया गया है, तो एक्सकोड को पता नहीं होगा कि आपके स्रोत कोड में यह परिभाषित नहीं है। यह आपको गलत वर्तनी के उपयोग की तलाश करने का मौका भी देता है। यदि "परिभाषा पर जाएं" काम नहीं करता है, तो आप जानते हैं कि आपने इसे गलत लिखा है।

BTW एक #if निर्देश के भीतर

, किसी भी मैक्रो परिभाषित नहीं है 0. ने ले ली है तो #if डीबग काम करेंगे अगर डीबग परिभाषित किया गया है नहीं, या यदि डीबग 0 के रूप में परिभाषित किया गया है, और यह संकलन नहीं होगा अगर डीबग के रूप में परिभाषित किया गया है कुछ नहीं - जो आपको बताएगा कि क्या गलत है ताकि आप इसे ठीक कर सकें। उस बिंदु से, #if का उपयोग तब तक बेहतर होता है जब तक यह संकलित नहीं होता है।

संबंधित मुद्दे