2010-05-17 19 views
89

सी में/C++#if 0 ..... #endif ब्लॉक क्या करता है?

क्या एक #if 0/#endif ब्लॉक के बीच रखा कोड का क्या होगा?

#if 0 

//Code goes here 

#endif 

क्या कोड बस छोड़ दिया जाता है और इसलिए इसे निष्पादित नहीं किया जाता है?

+11

इस टिप्पणी से बाहर कोड की एक बड़ी मात्रा या कोड के ब्लॉक के शामिल किए जाने के परीक्षण की अनुमति देने के लिए इस्तेमाल किया एक तकनीक है। इस सुविधा के बिना, किसी को या तो '//' के साथ प्रत्येक पंक्ति को उपसर्ग करना होगा या '/ * 'के साथ अनुभाग शुरू करना होगा और' * /' के साथ अनुभाग समाप्त करना होगा। बाद की तकनीकों के साथ समस्या यह है कि टिप्पणी घोंसला नहीं करती है ताकि डेवलपर को प्रारंभ और अंत के बीच किसी भी '* /' को जांच और संभाल लेना चाहिए। –

+1

संभावित डुप्लिकेट [क्यों कोई 1 सी प्रीप्रोसेसर निर्देश का उपयोग करेगा] (http://stackoverflow.com/questions/2266060/why-would-somebody-use-an-if-1-c-preprocessor- डायरेक्टिव) –

उत्तर

109

न केवल इसे निष्पादित नहीं किया जाता है, यह संकलित भी नहीं होता है।

#if एक प्रीप्रोसेसर कमांड है, जिसे वास्तविक संकलन चरण से पहले मूल्यांकन किया जाता है। उस ब्लॉक के अंदर कोड संकलित बाइनरी में प्रकट नहीं होता है।

इसका उपयोग अक्सर बाद में उन्हें वापस करने के इरादे से अस्थायी रूप से कोड के सेगमेंट को हटाने के लिए किया जाता है।

+48

... बाद में वापस, लेकिन अक्सर भूल जाता है और पढ़ने के लिए कोड भयानक बनाता है। – pmr

+2

^^ सचमुच मैं वास्तव में क्या कर रहा हूं ... –

17

यह उस कोड को स्थायी रूप से टिप्पणी करता है ताकि संकलक इसे कभी संकलित नहीं करेगा।

कोडर बाद में #ifdef को उस कोड में संकलित करने के लिए बदल सकता है यदि वह चाहता है।

यह बिल्कुल ठीक है जैसे कोड मौजूद नहीं है।

61

यह एक महत्वपूर्ण अंतर को छोड़कर, ब्लॉक को टिप्पणी करने के समान है: Nesting कोई समस्या नहीं है। इस कोड पर विचार करें:

foo(); 
bar(x, y); /* x must not be NULL */ 
baz(); 

अगर मैं इसे बाहर टिप्पणी करना चाहते हैं, मैं कोशिश कर सकते हैं:

/* 
foo(); 
bar(x, y); /* x must not be NULL */ 
baz(); 
*/ 

Bzzt। वक्य रचना त्रुटि! क्यूं कर? चूंकि ब्लॉक टिप्पणियां घोंसला नहीं करती हैं, और इसलिए (जैसा कि आप एसओ के सिंटैक्स हाइलाइटिंग से देख सकते हैं) */ शब्द "न्यूल" शब्द के बाद टिप्पणी को समाप्त करता है, baz कॉल पर टिप्पणी नहीं करता है, और एक वाक्यविन्यास त्रुटि के बाद। दूसरी तरफ:

#if 0 
foo(); 
bar(x, y); /* x must not be NULL */ 
baz(); 
#endif 

पूरी चीज को टिप्पणी करने के लिए काम करता है। और #if 0 है, एक दूसरे को इतना की तरह साथ इच्छा घोंसला:

#if 0 
pre_foo(); 
#if 0 
foo(); 
bar(x, y); /* x must not be NULL */ 
baz(); 
#endif 
quux(); 
#endif 

निश्चित रूप से हालांकि यह थोड़ा भ्रमित हो जाते हैं और अगर ठीक से टिप्पणी नहीं की एक रखरखाव सिरदर्द बन सकता है।

+4

बस ध्यान दें कि #if के अंदर कोड को स्पष्ट रूप से सही होना चाहिए (टिप्पणियों के विपरीत) और प्रीप्रोसेसर निर्देश अभी भी प्रभावी हैं (ditto)। – jpalecek

+0

@ डेविड: यह स्पष्ट रूप से सही नहीं है, लेकिन यह अभी भी संकलित होगा। तो कोड को स्पष्ट रूप से सही नहीं होना चाहिए। –

+1

@ डेनिस, मुझे 'foo.c: 3: gcc से unterminated स्ट्रिंग या वर्ण स्थिर' मिलता है, आप क्या उपयोग कर रहे हैं? –

6

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

अगर कोई #if 0 कहता है तो वे कोड को प्रभावी ढंग से टिप्पणी कर रहे हैं, इसलिए इसे कभी संकलित नहीं किया जाएगा। आप इस बारे में सोच सकते हैं जैसे कि उन्होंने/* ... */इसके आसपास रखा था। यह काफी समान नहीं है, लेकिन इसका एक ही प्रभाव है।

यदि आप समझना चाहते हैं कि विस्तार से क्या हुआ, तो आप अक्सर देख सकते हैं। प्रीप्रोसेसर चलाने के बाद कई कंपाइलर्स आपको फ़ाइलों को देखने की अनुमति देंगे। उदाहरण के लिए, विजुअल सी ++ पर स्विच/पी कमांड प्रीप्रोसेसर निष्पादित करेगा और परिणाम को .i फ़ाइल में रखेगा।

+0

काफी नहीं। प्रीप्रोसेसर टोकन के बजाए लाइन द्वारा पारदर्शी है। आपके स्पष्टीकरण के अनुसार यह कहना संभव नहीं होगा उदा। '#if WIN32 || __CYGWIN__' लेकिन यह अपेक्षा के अनुसार काम करता है। –

+0

मैं सरलीकृत कर रहा था। यदि कोई है या, यह जांच करेगा कि टोकन गैर-शून्य है या नहीं। इसी तरह यदि कोई है और यह जांच करेगा कि दोनों शून्य हैं या नहीं। –

3

# से शुरू होने वाली रेखाएं preprocessor directives हैं। #if 0 [...] #endif ब्लॉक इसे कंपाइलर में नहीं बनाते हैं और कोई मशीन कोड नहीं बनाएंगे।

आप प्रदर्शन कर सकते हैं क्या एक स्रोत फ़ाइल ifdef.cxx साथ पूर्वप्रक्रमक के साथ होता है:

#if 0 
This code will not be compiled 
#else 
int i = 0; 
#endif 

gcc -E ifdef.cxx चल रहा है तुम्हें दिखाता हूँ क्या संकलित हो जाता है।

आप विकास चक्र के दौरान संकलित कोड के ब्लॉक को रोकने के लिए इस तंत्र का उपयोग करना चुन सकते हैं, लेकिन शायद आप इसे अपने स्रोत नियंत्रण में जांचना नहीं चाहते हैं क्योंकि यह आपके कोड पर केवल क्रॉफ्ट जोड़ता है और पठनीयता को कम करता है। यदि यह कोड का ऐतिहासिक टुकड़ा है जिस पर टिप्पणी की गई है, तो इसे हटा दिया जाना चाहिए: स्रोत नियंत्रण में इतिहास है, है ना?

इसके अलावा, इस सवाल का जवाब दोनों सी और सी ++ लेकिन वहाँ C/C++ कहा जाता है कोई भाषा है और यह एक अच्छी आदत इस तरह के एक भाषा का उल्लेख करने के लिए नहीं है के लिए एक ही हो सकता है।

+4

"सी या सी ++" के लिए शॉर्टेंड के रूप में सी/सी ++ कहने में क्या गलत है? क्या आप ईमानदारी से सोचते हैं कि किसी को यह सोचने में भ्रमित होने जा रहा है कि "सी/सी ++" नामक एक भाषा है? –

+1

@ क्रिस: लोग लगातार प्रश्न पूछते हैं जैसे "मैं सी/सी ++ में एक्स कैसे करूं?" जो एक गैरकानूनी सवाल है; आप एक या दूसरे में कोडिंग कर रहे हैं, और यदि आपने अभी तक नहीं चुना है तो आपको उस तथ्य में स्पष्ट होना चाहिए। तो, हां, लोग "सी/सी ++" नामक एक भाषा होने के बारे में उलझन में हैं –

+1

क्या एक गैरकानूनी बयान! ऐसे हजारों प्रश्न हैं जिनके उत्तर सी और सी ++ दोनों के लिए प्रासंगिक हैं। याद रखें कि यह प्रश्न पूछने के लिए एक साइट है। सिर्फ इसलिए कि आप एक सामान्य प्रश्न पूछ रहे हैं इसका मतलब यह नहीं है कि आप नहीं जानते कि आप किस भाषा का उपयोग कर रहे हैं। यदि आपको संदेह है कि यह मामला है, जैसा कि इस प्रश्न में, यह सी या सी ++ निर्दिष्ट करने में कैसे मदद करता है? क्या आपको लगता है कि यह उपयोगी होगा यदि सी या सी ++ पर लागू होने वाले प्रत्येक प्रश्न को दो बार पूछा जाए? –

1

नहीं काफी

int main(void) 
{ 
    #if 0 
    the apostrophe ' causes a warning 
    #endif 
    return 0; 
} 

इससे पता चलता है जीसीसी 4.2.4

+2

यह चेतावनी प्रीप्रोसेसर द्वारा उत्पन्न होती है, न कि संकलक। संकलक केवल देखने के लिए हो जाता है: # 1 "टीसी" # 1 "" # 1 "<कमांड लाइन>" # 1 "टीसी" पूर्णांक मुख्य (शून्य) { वापसी 0 ; } – Johnsyweb

13

वास्तव में क्या एक #if 0 है ... # साथ "टीसी: 4: 19:: चेतावनी 'चरित्र समाप्त लापता" एंडिफ ब्लॉक करते हैं?

यह आपको बताता है कि लेखक ने स्पष्ट रूप से संस्करण नियंत्रण प्रणाली के बारे में कभी नहीं सुना है। जो बदले में, आपको जितना संभव हो सके उतना दूर चलाने के लिए कहता है & hellip;

1

यह टिप्पणी करने का एक सस्ता तरीका है, लेकिन मुझे संदेह है कि इसमें डीबगिंग क्षमता हो सकती है। उदाहरण के लिए, मान लें कि आपके पास एक फ़ाइल में आउटपुट मान बनाना है। हो सकता है कि आप इसे अंतिम संस्करण में नहीं चाहते हैं ताकि आप #if 0 ... #endif का उपयोग कर सकें।

इसके अलावा, मैं डिबग इस प्रयोजन के लिए यह करने का एक बेहतर तरीका है पर शक करने के लिए होगा:

#ifdef DEBUG 
// output to file 
#endif 

आप ऐसा कुछ कर सकते हैं और इसे और अधिक समझ बनाने के कर सकते हैं और तुम सब करने की है डीबग परिभाषित है परिणाम देखने के लिए।

7

मैं #else मामले के लिए पर जोड़ना चाहते हैं:

#if 0 
    /* Code here will NOT be complied. */ 
#else 
    /* Code will be compiled. */ 
#endif 


#if 1 
    /* Code will be complied. */ 
#else 
    /* Code will NOT be compiled. */ 
#endif 
संबंधित मुद्दे