मैं आमतौर पर हेडर फाइल की शुरुआत में इस तरह कोड को देखकर किया गया है:#ifndef और #define क्यों C++ शीर्षलेख फ़ाइलों में उपयोग किए जाते हैं?
#ifndef HEADERFILE_H
#define HEADERFILE_H
और फ़ाइल के अंत में
#endif
इस का उद्देश्य क्या है?
मैं आमतौर पर हेडर फाइल की शुरुआत में इस तरह कोड को देखकर किया गया है:#ifndef और #define क्यों C++ शीर्षलेख फ़ाइलों में उपयोग किए जाते हैं?
#ifndef HEADERFILE_H
#define HEADERFILE_H
और फ़ाइल के अंत में
#endif
इस का उद्देश्य क्या है?
जिन्हें #include guards कहा जाता है।
एक बार हेडर शामिल होने के बाद, यह जांचता है कि क्या एक अद्वितीय मान (इस मामले में HEADERFILE_H
) परिभाषित किया गया है। फिर यदि यह परिभाषित नहीं किया गया है, तो यह इसे परिभाषित करता है और शेष पृष्ठ पर जारी रहता है।
जब कोड दोबारा शामिल किया गया है, तो पहले ifndef
विफल हो जाता है, जिसके परिणामस्वरूप एक खाली फ़ाइल होती है।
जो किसी भी पहचानकर्ताओं जैसे कि प्रकार, enums और स्थिर चर के डबल घोषणा को रोकता है।
एमएम इंटरस्टेस्टिंग। मैंने एक बार वीसी ++ cuz छोड़ दिया यह मुझे डबल परिभाषा के बारे में त्रुटियां दे दी।मुझे लगता है कि मैं अब एक उद्देश्य-सी कोडर हूं =) –
कोनिंग बार्ड XIV: वीसी में एक बार #pragma भी है जो वही करता है :-) – Joey
इसके अलावा यह पुनरावर्ती समावेशन को रोकता है ... कल्पना करें "alice.h" में " bob.h "और" bob.h "में" alice.h "शामिल है और उनमें गार्ड शामिल नहीं हैं ... –
#ifndef <token>
/* code */
#else
/* code to include if the token is defined */
#endif
#ifndef
चेकों दिया टोकन #defined
फ़ाइल में या एक शामिल फ़ाइल में पहले आ चुका है,; यदि नहीं, तो इसमें इसके बीच कोड और समापन #else
या यदि कोई #else
मौजूद है, #endif
कथन शामिल है। #ifndef
को फ़ाइल को शामिल करने के बाद एक टोकन को परिभाषित करके हेडर फ़ाइलों को idempotent बनाने के लिए अक्सर उपयोग किया जाता है और यह जांचकर कि उस फ़ाइल के शीर्ष पर टोकन सेट नहीं किया गया था।
#ifndef _INCL_GUARD
#define _INCL_GUARD
#endif
अंडरस्कोर से शुरू होने वाले पहचानकर्ता आरक्षित हैं; आपको उन्हें स्वयं परिभाषित नहीं करना चाहिए। '#ifndef H_HEADER_NAME' जैसे कुछ का उपयोग करें। –
मुझे पता है कि यह एक पुरानी टिप्पणी है, लेकिन असल में अंडरस्कोर प्रतिबंध केवल "बाहरी पहचानकर्ता" पर लागू होता है - पहचानकर्ता जो संकलित ऑब्जेक्ट की प्रतीक तालिका में समाप्त हो सकते हैं, यानी वैश्विक चर और फ़ंक्शन नाम। यह मैक्रो नामों पर लागू नहीं होता है। – Stu
स्टू की टिप्पणी सच है? मैंने बस https://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier पढ़ा है और अब मुझे इतना यकीन नहीं है। – Will
यह एक ही शीर्षलेख फ़ाइल एकाधिक समय के एकाधिक समावेशन से रोकता है।
#ifndef __COMMON_H__
#define __COMMON_H__
//header file content
#endif
मान लीजिए कि आपने इस हेडर फ़ाइल को एकाधिक फ़ाइलों में शामिल किया है। तो पहली बार __COMMON_H__ परिभाषित नहीं किया गया है, यह परिभाषित और हेडर फ़ाइल शामिल हो जाएगा।
अगली बार __COMMON_H__ परिभाषित किया गया है, इसलिए इसमें फिर से शामिल नहीं होगा।
+1 - मुझे भी एक ही संदेह था, और यहां बहुत अच्छा जवाब मिला, भविष्य के आगंतुकों के लिए उपयोगी हो सकता है: http://stackoverflow.com/q/3246803/1134940 –
मैं इसमें जोड़ना चाहता हूं कि आप इसे जोड़ना चाहते हैं ** ** प्रज्ञा का एक बार ** का उपयोग करें, आपको बस इतना करना है और यह ifndef के समान उद्देश्य प्रदान करता है। दोनों की तुलना के लिए, देखें: http://stackoverflow.com/questions/1143936/pragma-once-vs-include-guards – Dimension
उल्लेख करने के लिए सबसे अच्छा है कि '# प्रगमा' क्या है: यह एक कंपाइलर-विशिष्ट सुविधा को सक्रिय करता है। यद्यपि '#pragma एक बार' * बहुत * व्यापक रूप से समर्थित है, यह गैर मानक है। – Potatoswatter