प्रत्येक .h फ़ाइल #ifndef #define #endif से क्यों शुरू होती है? हम निश्चित रूप से उन निर्देशों के बिना कार्यक्रम संकलित कर सकते हैं।सी और सी ++ में, प्रत्येक .h फ़ाइल आमतौर पर #ifndef #define #endif निर्देशों से घिरा क्यों है?
उत्तर
यह एक तथाकथित "गार्ड शामिल है" है। इसका उद्देश्य फ़ाइल को कई बार पार्स किए जाने से रोकने के लिए है यदि इसे कई बार शामिल किया गया हो।
इसे एक गार्ड शामिल कहा जाता है। जब तक आप बड़े प्रोग्राम लिखना शुरू नहीं करते हैं तब तक आप उनके बिना लिख सकते हैं और पता लगा सकते हैं कि आपको एक .c फ़ाइल से, एक से अधिक, सीधे या परोक्ष रूप से, एक ही .h फ़ाइल को शामिल करने की आवश्यकता है। फिर गार्ड को शामिल किए बिना आपको कई परिभाषा त्रुटियां मिलेंगी, लेकिन उनके साथ, हेडर फ़ाइल सामग्री केवल एक बार पार्स की जाती है और उन त्रुटियों से परहेज करते हुए, बाद के सभी बार छोड़ दी जाती है। हमेशा उनका उपयोग करने के लिए यह एक अच्छा अभ्यास है।
यह एक फ़ाइल के एकाधिक समावेशन को रोकता है। एक ही
#pragma once
निर्देशों का उपयोग किया जा सकता है, लेकिन उन #ifndefs इस तरह हर संकलक द्वारा समर्थित मानक हैं।
#pragma एक बार। एक संकलक विशिष्ट विस्तार है। –
... लेकिन निष्पक्ष होने के लिए व्यापक रूप से समर्थित एक –
यदि किसी शीर्षलेख फ़ाइल में
int i;जैसी परिभाषा शामिल है, तो गार्ड के बिना कई बार शामिल किया जा रहा है, एक संकलन त्रुटि उत्पन्न करेगा।
ifndef जांचता है कि कुछ प्रीप्रोसेसर चर परिभाषित नहीं किया गया है (और यह पहली बार नहीं है), फिर इसे फिर से कब्जा करने से बचने के लिए स्पष्ट रूप से परिभाषित करता है। एमएसवीसी में आप
ifndef
के बजाय
#pragma onceका भी उपयोग कर सकते हैं।
यदि मैं सही ढंग से समझता हूं, तो आप जानना चाहते हैं कि, गार्ड शामिल करने की अनुपस्थिति में, हेडर फ़ाइल समेत कई बार एक त्रुटि या खतरनाक व्यवहार हो सकता है। यह कई परिभाषाओं को छोड़कर,
एक दुर्भावनापूर्ण प्रोग्रामर की कल्पना करें, जिसके शीर्षलेख फ़ाइल में गार्ड शामिल नहीं हैं। उनकी हेडर फ़ाइल एक मैक्रो, 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
कि क्या NDEBUG
assert.h
के शामिल किए जाने के समय में परिभाषित किया गया है के आधार पर अलग अलग व्यवहार के साथ एक बार से #include
घ अधिक होने की अनुमति देता है। तो, assert.h
में गार्ड शामिल नहीं हो सकते हैं। यह एक विशेषता है, हालांकि एक बग नहीं है।
- 1. पुराना सी कंपाइलर #ifndef #define
- 2. #ifndef और #define क्यों C++ शीर्षलेख फ़ाइलों में उपयोग किए जाते हैं?
- 3. सी और .h फ़ाइल एक्सटेंशन का क्या मतलब है सी?
- 4. #ifndef FILENAME का उद्देश्य .... शीर्षलेख फ़ाइल में # endif
- 5. यूनिकोड - आमतौर पर सी ++
- 6. सी: #define निर्देश वैश्विक हैं?
- 7. सी # संकलक निर्देशों
- 8. सी/सी ++ कोड के लिए प्रीप्रोसेसर निर्देश #ifndef
- 9. सी ++ #define
- 10. #ifdef और #ifndef
- 11. चेतावनी: #endif निर्देश
- 12. (सी ++) .h फ़ाइल में पूरी कक्षा?
- 13. .h फ़ाइलों को संशोधित किए बिना मैक्रो रेडिफ़िनेशन को संभालना ... सी/सी ++ भाषा
- 14. सी में "ifndef" और "if! परिभाषित" के बीच अंतर?
- 15. #define उपयोग/सी ++
- 16. सीपीपी | .h फ़ाइलें (सी ++)
- 17. #ifndef वाक्यविन्यास C++
- 18. सी सशर्त प्रीप्रोसेसर-निर्देशों में तारों की तुलना कैसे करें
- 19. सी # सी ++ से '#ifndef _DEBUG' को दोहराने के लिए सी # में कोई तरीका है?
- 20. सी ++ शून्य कास्ट और ऑपरेटर कॉमा #define
- 21. सी प्रीप्रोसेसर मैक्रोज़ के लिए प्रीप्रोसेसर निर्देशों को शामिल करना संभव है?
- 22. सी अजीब विसंगति, फ़ाइल में लिखते समय (आमतौर पर stdout पर लिखते समय काम करता है)
- 23. क्यों "पैकेज" कीवर्ड और .h?
- 24. सी ++: पाठ फ़ाइल नाम
- 25. #define निर्देशों के माध्यम से LLVM और उसके संस्करण का पता कैसे लगाएं?
- 26. # .h या .c/.cpp में शामिल हैं?
- 27. सशर्त संकलन (ifndef)
- 28. #define
- 29. एक बार या #ifndef #endif का उपयोग करने के लिए कौन सा कुशल है?
- 30. प्रीकंपील्ड हेडर (सी/सी ++) का उपयोग क्यों करें?
Google "गार्ड शामिल हैं" –