में सी / सी ++
क्या होता है #if 0/ a #endifब्लॉक के बीच रखा कोड ?
#if 0
//Code goes here
#endif
क्या कोड बस छूट जाता है और इसलिए निष्पादित नहीं होता है?
में सी / सी ++
क्या होता है #if 0/ a #endifब्लॉक के बीच रखा कोड ?
#if 0
//Code goes here
#endif
क्या कोड बस छूट जाता है और इसलिए निष्पादित नहीं होता है?
जवाबों:
इतना ही नहीं निष्पादित नहीं करता है, यह भी संकलित नहीं करता है।
#ifएक प्रीप्रोसेसर कमांड है, जिसका मूल्यांकन वास्तविक संकलन चरण से पहले किया जाता है। उस ब्लॉक के अंदर कोड संकलित बाइनरी में दिखाई नहीं देता है।
यह अक्सर बाद में उन्हें वापस करने के इरादे से कोड के सेगमेंट को अस्थायी रूप से हटाने के लिए उपयोग किया जाता है।
यह ब्लॉक के बारे में टिप्पणी करने के समान है, एक महत्वपूर्ण अंतर को छोड़कर: घोंसला बनाना कोई समस्या नहीं है। इस कोड पर विचार करें:
foo();
bar(x, y); /* x must not be NULL */
baz();
अगर मैं इसे टिप्पणी करना चाहता हूं, तो मैं कोशिश कर सकता हूं:
/*
foo();
bar(x, y); /* x must not be NULL */
baz();
*/
Bzzt। वक्य रचना त्रुटि! क्यों? क्योंकि ब्लॉक टिप्पणियां घोंसला नहीं बनाती हैं, और इसलिए (जैसा कि आप SO के सिंटैक्स हाइलाइटिंग से देख सकते हैं) */शब्द के बाद "NULL" टिप्पणी को समाप्त कर देता है, जिससे bazकॉल टिप्पणी नहीं होती है, और एक सिंटैक्स त्रुटि के */बाद 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
हालांकि निश्चित रूप से यह थोड़ा भ्रामक हो सकता है और अगर ठीक से टिप्पणी नहीं की जाती है तो रखरखाव सिरदर्द बन सकता है।
foo.c:3: unterminated string or character constantजीसीसी से मिलता है, आप क्या उपयोग कर रहे हैं?
वास्तव में एक #if 0 ... #endif ब्लॉक क्या करता है?
यह बताता है कि लेखक ने स्पष्ट रूप से संस्करण नियंत्रण प्रणाली के बारे में कभी नहीं सुना है। जो बदले में, आपको यथासंभव…
जब प्रीप्रोसेसर #if देखता है तो यह जाँचता है कि क्या अगले टोकन का गैर-शून्य मान है। यदि ऐसा होता है, तो यह कोड को कंपाइलर के लिए चारों ओर रखता है। यदि ऐसा नहीं होता है, तो उसे उस कोड से छुटकारा मिल जाता है इसलिए कंपाइलर उसे कभी नहीं देखता है।
अगर कोई कहता है कि # आईएफ 0 वे कोड को प्रभावी ढंग से टिप्पणी कर रहे हैं, इसलिए इसे कभी भी संकलित नहीं किया जाएगा। आप इसके बारे में ऐसा ही सोच सकते हैं जैसे कि उन्होंने / * ... * / इसके आसपास रखा हो। यह काफी समान नहीं है, लेकिन इसका प्रभाव समान है।
यदि आप यह समझना चाहते हैं कि विस्तार से क्या हुआ, तो आप अक्सर देख सकते हैं। कई संकलक आपको प्रीप्रोसेसर चलाने के बाद फ़ाइलों को देखने की अनुमति देंगे। उदाहरण के लिए, Visual C ++ पर स्विच / P कमांड प्रीप्रोसेसर को निष्पादित करेगा और परिणामों को एक .i फ़ाइल में डालेगा।
#if WIN32 || __CYGWIN__लेकिन यह उम्मीद के मुताबिक काम करता है।
एक के साथ शुरुआत लाइन्स #हैं पूर्वप्रक्रमक निर्देशों । #if 0 [...] #endifब्लॉक इसे संकलक के लिए नहीं बनाते हैं और कोई मशीन कोड उत्पन्न नहीं करेंगे।
आप एक स्रोत फ़ाइल के साथ प्रीप्रोसेसर के साथ क्या होता है यह प्रदर्शित कर सकते हैं ifdef.cxx:
#if 0
This code will not be compiled
#else
int i = 0;
#endif
चल रहा है gcc -E ifdef.cxx आपको दिखाएगा कि क्या संकलित है।
आप विकास चक्र के दौरान संकलित किए जा रहे कोड के एक ब्लॉक को रोकने के लिए इस तंत्र का उपयोग करने का चयन कर सकते हैं, लेकिन आप शायद इसे अपने स्रोत नियंत्रण में नहीं देखना चाहेंगे क्योंकि यह आपके कोड में cruft जोड़ता है और पठनीयता को कम करता है। यदि यह कोड का एक ऐतिहासिक टुकड़ा है जिस पर टिप्पणी की गई है, तो इसे हटा दिया जाना चाहिए: स्रोत नियंत्रण में इतिहास शामिल है, है ना?
साथ ही, उत्तर C और C ++ दोनों के लिए समान हो सकता है, लेकिन C / C ++ नाम की कोई भाषा नहीं है और ऐसी भाषा का संदर्भ देना अच्छी आदत नहीं है।
काफी नहीं
int main(void)
{
#if 0
the apostrophe ' causes a warning
#endif
return 0;
}
यह "tc: 4: 19: चेतावनी: लापता '' चरित्र" को gcc 4.2.4 के साथ दिखाता है
यह टिप्पणी करने का एक सस्ता तरीका है, लेकिन मुझे संदेह है कि इसमें डिबगिंग की क्षमता हो सकती है। उदाहरण के लिए, मान लें कि आपके पास एक फ़ाइल के लिए आउटपुट मान है। आप नहीं चाहेंगे कि अंतिम संस्करण में आप # 0 का उपयोग कर सकें ... #endif।
इसके अलावा, मुझे डिबग उद्देश्य के लिए इसे करने के एक बेहतर तरीके पर संदेह है:
#ifdef DEBUG
// output to file
#endif
आप ऐसा कुछ कर सकते हैं और यह अधिक समझ में आता है और परिणाम देखने के लिए आपको केवल DEBUG को परिभाषित करना होगा।
//या अनुभाग को शुरू करना होगा और अनुभाग को/*समाप्त करना होगा*/। बाद की तकनीकों के साथ समस्या यह है कि टिप्पणी की घोंसला नहीं है इसलिए डेवलपर को*/शुरू और अंत के बीच किसी भी चीज को जांचना और संभालना चाहिए ।