2010-01-10 8 views
7

प्रत्येक .h फ़ाइल #ifndef #define #endif से क्यों शुरू होती है? हम निश्चित रूप से उन निर्देशों के बिना कार्यक्रम संकलित कर सकते हैं।सी और सी ++ में, प्रत्येक .h फ़ाइल आमतौर पर #ifndef #define #endif निर्देशों से घिरा क्यों है?

+7

Google "गार्ड शामिल हैं" –

उत्तर

14

यह एक तथाकथित "गार्ड शामिल है" है। इसका उद्देश्य फ़ाइल को कई बार पार्स किए जाने से रोकने के लिए है यदि इसे कई बार शामिल किया गया हो।

+0

और उसी कक्षा की कई परिभाषाओं को रोकने के लिए। – James

+1

क्या कोई #import निर्देश था, या यह सिर्फ मेरी कल्पना है? –

+2

@Autopulated: वह कई बार पार्स किए जाने का मतलब है। चिंता करने के लिए कक्षा पुनर्वितरण की तुलना में अधिक चीजें हैं; सभी "एकाधिक पार्सिंग" द्वारा encapsulated हैं। – GManNickG

3

इसे एक गार्ड शामिल कहा जाता है। जब तक आप बड़े प्रोग्राम लिखना शुरू नहीं करते हैं तब तक आप उनके बिना लिख ​​सकते हैं और पता लगा सकते हैं कि आपको एक .c फ़ाइल से, एक से अधिक, सीधे या परोक्ष रूप से, एक ही .h फ़ाइल को शामिल करने की आवश्यकता है। फिर गार्ड को शामिल किए बिना आपको कई परिभाषा त्रुटियां मिलेंगी, लेकिन उनके साथ, हेडर फ़ाइल सामग्री केवल एक बार पार्स की जाती है और उन त्रुटियों से परहेज करते हुए, बाद के सभी बार छोड़ दी जाती है। हमेशा उनका उपयोग करने के लिए यह एक अच्छा अभ्यास है।

4

यह एक फ़ाइल के एकाधिक समावेशन को रोकता है। एक ही

#pragma once 

निर्देशों का उपयोग किया जा सकता है, लेकिन उन #ifndefs इस तरह हर संकलक द्वारा समर्थित मानक हैं।

+3

#pragma एक बार। एक संकलक विशिष्ट विस्तार है। –

+0

... लेकिन निष्पक्ष होने के लिए व्यापक रूप से समर्थित एक –

-1

यदि किसी शीर्षलेख फ़ाइल में

int i;
जैसी परिभाषा शामिल है, तो गार्ड के बिना कई बार शामिल किया जा रहा है, एक संकलन त्रुटि उत्पन्न करेगा।
ifndef जांचता है कि कुछ प्रीप्रोसेसर चर परिभाषित नहीं किया गया है (और यह पहली बार नहीं है), फिर इसे फिर से कब्जा करने से बचने के लिए स्पष्ट रूप से परिभाषित करता है। एमएसवीसी में आप ifndef के बजाय
#pragma once
का भी उपयोग कर सकते हैं।

1

यदि मैं सही ढंग से समझता हूं, तो आप जानना चाहते हैं कि, गार्ड शामिल करने की अनुपस्थिति में, हेडर फ़ाइल समेत कई बार एक त्रुटि या खतरनाक व्यवहार हो सकता है। यह कई परिभाषाओं को छोड़कर,

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

#ifndef SZ 
#define SZ 1024 
#else 
#if SZ == 1024 
#undef SZ 
#define SZ 128 
#else 
#error "You can include me no more than two times!" 
#endif 
#endif 

, यदि आप हेडर फाइल एक बार में शामिल हैं, आप SZ बराबर मिलता है 1024 के लिए आप इसे दो बार शामिल करते हैं, SZ बेशक 128 हो जाता है, सबसे वास्तविक: प्रोग्रामर इस तरह अपने हेडर फाइल लिख सकता है विश्व प्रोग्रामर दुर्भावनापूर्ण नहीं हैं, और कोई भी वास्तव में उपरोक्त कोड लिखता नहीं है।

ध्यान दें कि सी मानक assert.h कि क्या NDEBUGassert.h के शामिल किए जाने के समय में परिभाषित किया गया है के आधार पर अलग अलग व्यवहार के साथ एक बार से #include घ अधिक होने की अनुमति देता है। तो, assert.h में गार्ड शामिल नहीं हो सकते हैं। यह एक विशेषता है, हालांकि एक बग नहीं है।

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