2010-02-15 17 views
13

मैं कुछ सी स्रोत कोड के माध्यम से देख रहा हूँ और मैं निम्नलिखित हिस्साकोई #if 1 सी प्रीप्रोसेसर निर्देश का उपयोग क्यों करेगा?

#if 1 
typedef unsigned short PronId;    /* uniquely identifies (word,pron) pair, i.e. 
            homophones have different Ids */ 
typedef unsigned short LMId; 
#define LM_NGRAM_INT 
#else 
typedef unsigned int LMId; 
typedef unsigned int PronId; 
#undef LM_NGRAM_INT 
#endif 

क्यों किसी को क्या करना होगा #if 1 समझ में नहीं आता? क्या यह सच नहीं है कि केवल पहला ब्लॉक संसाधित किया जाएगा?

+2

'PronId'? क्या यह कोड वयस्क-उन्मुख वेबसाइट के लिए है? – Thomas

+0

@ थॉमस अच्छी तरह से मनाया! – Fuzz

+2

@ थॉमस नहीं, यह एक भाषण मान्यता अनुप्रयोग में सर्वनाम आईडी के लिए छोटा है –

उत्तर

17

हाँ .. केवल पहला ब्लॉक संसाधित किया जाएगा --- जब तक कि कोई 1 को 0 तक नहीं बदलता। तब अन्य ब्लॉक संकलित किया जाएगा। अलग-अलग एल्गोरिदम का परीक्षण करते समय कोड के अंदर और बाहर अस्थायी स्विच ब्लॉक के लिए यह एक सुविधाजनक तरीका है।

4

विभिन्न कोड पथों के प्रयोग के लिए।

17

ताकि कोई जल्दी से #if 1 को #if 0 बदलकर संकलित करने के लिए कौन सा हिस्सा चुन सके।

1

#if सच के लिए यह कहने का एक और तरीका है, यह संभवतः कोड का परिणाम था जो पहले किसी अन्य प्रतीक की जांच कर रहा था, फिर हमेशा सत्य होने के लिए प्रतिक्रिया करता था।

5

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

5

सॉफ़्टवेयर की मौलिक गुणों में से एक यह है कि कंप्यूटर प्रोग्राम को संशोधित करने के लिए सस्ता है।

यही कारण है कि कुछ कोड इस तरह से लिखा गया है कि यह संशोधन को आसान बना देगा। यही कारण है कि उन्हें "इंटरफ़ेस" या "प्रॉक्सी" जैसे विभिन्न पैटर्न की आवश्यकता होती है।

और यही कारण है कि आप कभी कभी की तरह #if 1 अजीब निर्माणों को देखने के है - #endif, एक ही उद्देश्य जिनमें से आसानी से, कोड है कि संकलित किया जाएगा का हिस्सा स्विच करने के लिए छोटा सा प्रयास कर रहा है - #else: 0.

+0

मुझे उद्धरण पसंद है: 'कंप्यूटर प्रोग्राम संशोधित करने के लिए सस्ता है' – nmxprime

3

को 1 बदलते यह कोड के बड़े टुकड़े पर टिप्पणी करने का एक अलग तरीका है, इसलिए, संपादक ऑटो इंडेंटेशन इंडेंटेशन को तोड़ नहीं देगा (कोड के ब्लॉक को कोड के रूप में इंडेंट किया जाएगा, कोड के रूप में नहीं)।

1

मैं वास्तव में इसे कोड फोल्डिंग को आसान बनाने के लिए एक क्लज के रूप में उपयोग कर रहा हूं; अगर मैं #if 1 ... #endif में कोड का एक अनुभाग लपेटता हूं, तो मैं इसे अपने संपादक में जोड़ सकता हूं। (प्रश्न में कोड बहुत मैक्रो-भारी है, और मेरे द्वारा लिखित नहीं है, इसलिए कोड का एक बड़ा ब्लॉक प्रबंधित करने के पारंपरिक तरीके काम नहीं करेंगे।)

0

ऐसा करने का क्लीनर तरीका शायद कुछ ऐसा कर रहा है :

#if ALGO1 

#else 

#endif 

लेकिन, आप एक makefile में कहीं संकलक आर्ग को ALGO1 में पारित करने के लिए ... उदाहरण के लिए होगा, आप जोड़ने की जरूरत है -DALGO1 = 1 (यदि कोई 1 प्रदान की जाती है, 1 मान लिया जाता है) । रेफरी: http://www.amath.unc.edu/sysadmin/DOC4.0/c-compiler/user_guide/cc_options.doc.html

यह अधिक काम है ... इसलिए, आमतौर पर, त्वरित जांच के लिए, #if 1 का उपयोग किया जाता है। और कुछ मामलों में, भूल गए और पीछे छोड़ दिया :-)

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