2009-10-31 14 views
321

मैं आमतौर पर हेडर फाइल की शुरुआत में इस तरह कोड को देखकर किया गया है:#ifndef और #define क्यों C++ शीर्षलेख फ़ाइलों में उपयोग किए जाते हैं?

#ifndef HEADERFILE_H 
#define HEADERFILE_H 

और फ़ाइल के अंत में

#endif 

इस का उद्देश्य क्या है?

+22

+1 - मुझे भी एक ही संदेह था, और यहां बहुत अच्छा जवाब मिला, भविष्य के आगंतुकों के लिए उपयोगी हो सकता है: http://stackoverflow.com/q/3246803/1134940 –

+5

मैं इसमें जोड़ना चाहता हूं कि आप इसे जोड़ना चाहते हैं ** ** प्रज्ञा का एक बार ** का उपयोग करें, आपको बस इतना करना है और यह ifndef के समान उद्देश्य प्रदान करता है। दोनों की तुलना के लिए, देखें: http://stackoverflow.com/questions/1143936/pragma-once-vs-include-guards – Dimension

+2

उल्लेख करने के लिए सबसे अच्छा है कि '# प्रगमा' क्या है: यह एक कंपाइलर-विशिष्ट सुविधा को सक्रिय करता है। यद्यपि '#pragma एक बार' * बहुत * व्यापक रूप से समर्थित है, यह गैर मानक है। – Potatoswatter

उत्तर

369

जिन्हें #include guards कहा जाता है।

एक बार हेडर शामिल होने के बाद, यह जांचता है कि क्या एक अद्वितीय मान (इस मामले में HEADERFILE_H) परिभाषित किया गया है। फिर यदि यह परिभाषित नहीं किया गया है, तो यह इसे परिभाषित करता है और शेष पृष्ठ पर जारी रहता है।

जब कोड दोबारा शामिल किया गया है, तो पहले ifndef विफल हो जाता है, जिसके परिणामस्वरूप एक खाली फ़ाइल होती है।

जो किसी भी पहचानकर्ताओं जैसे कि प्रकार, enums और स्थिर चर के डबल घोषणा को रोकता है।

+3

एमएम इंटरस्टेस्टिंग। मैंने एक बार वीसी ++ cuz छोड़ दिया यह मुझे डबल परिभाषा के बारे में त्रुटियां दे दी।मुझे लगता है कि मैं अब एक उद्देश्य-सी कोडर हूं =) –

+0

कोनिंग बार्ड XIV: वीसी में एक बार #pragma भी है जो वही करता है :-) – Joey

+63

इसके अलावा यह पुनरावर्ती समावेशन को रोकता है ... कल्पना करें "alice.h" में " bob.h "और" bob.h "में" alice.h "शामिल है और उनमें गार्ड शामिल नहीं हैं ... –

21
#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 
+3

अंडरस्कोर से शुरू होने वाले पहचानकर्ता आरक्षित हैं; आपको उन्हें स्वयं परिभाषित नहीं करना चाहिए। '#ifndef H_HEADER_NAME' जैसे कुछ का उपयोग करें। –

+5

मुझे पता है कि यह एक पुरानी टिप्पणी है, लेकिन असल में अंडरस्कोर प्रतिबंध केवल "बाहरी पहचानकर्ता" पर लागू होता है - पहचानकर्ता जो संकलित ऑब्जेक्ट की प्रतीक तालिका में समाप्त हो सकते हैं, यानी वैश्विक चर और फ़ंक्शन नाम। यह मैक्रो नामों पर लागू नहीं होता है। – Stu

+1

स्टू की टिप्पणी सच है? मैंने बस https://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier पढ़ा है और अब मुझे इतना यकीन नहीं है। – Will

2

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

#ifndef __COMMON_H__ 
#define __COMMON_H__ 
//header file content 
#endif 

मान लीजिए कि आपने इस हेडर फ़ाइल को एकाधिक फ़ाइलों में शामिल किया है। तो पहली बार __COMMON_H__ परिभाषित नहीं किया गया है, यह परिभाषित और हेडर फ़ाइल शामिल हो जाएगा।

अगली बार __COMMON_H__ परिभाषित किया गया है, इसलिए इसमें फिर से शामिल नहीं होगा।

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