सबसे पहले, अपनी पहली जांच को संबोधित करने के लिए:
जब आप इसे .h फ़ाइल में देखते हैं :
#ifndef FILE_H
#define FILE_H
/* ... Declarations etc here ... */
#endif
हेडर फ़ाइल को कई बार शामिल करने से रोकने की यह एक पूर्वप्रक्रमक तकनीक है, जो विभिन्न कारणों से समस्याग्रस्त हो सकती है। आपकी परियोजना के संकलन के दौरान, प्रत्येक .cpp फ़ाइल (आमतौर पर) संकलित की जाती है। सरल शब्दों में, इसका मतलब यह है कि कंपाइलर आपकी .cpp फ़ाइल को ले जाएगा , #includedइसके द्वारा कोई भी फाइल खोल देगा, उन सभी को एक बड़े पैमाने पर टेक्स्ट फाइल में बदल देगा, और फिर सिंटैक्स विश्लेषण करेगा और अंत में इसे कुछ इंटरमीडिएट कोड में बदल देगा, अनुकूलन / अन्य प्रदर्शन करेगा कार्य, और अंत में लक्ष्य वास्तुकला के लिए विधानसभा उत्पादन उत्पन्न करते हैं। इसके कारण, यदि कोई फ़ाइल #includedएक .cpp के अंतर्गत कई बार हैफ़ाइल, संकलक अपनी फ़ाइल सामग्री को दो बार जोड़ देगा, इसलिए यदि उस फ़ाइल के भीतर परिभाषाएँ हैं, तो आपको एक कंपाइलर त्रुटि मिलेगी जो आपको बता रही है कि आपने एक चर को फिर से परिभाषित किया है। जब फ़ाइल को संकलन प्रक्रिया में प्रीप्रोसेसर कदम से संसाधित किया जाता है, तो पहली बार इसकी सामग्री पहले दो पंक्तियों तक पहुंच जाती है यदि FILE_Hप्रीप्रोसेसर के लिए परिभाषित किया गया है तो जांच करेगा । यदि नहीं, तो यह परिभाषित करेगा FILE_Hऔर इसके और #endifनिर्देश के बीच कोड को संसाधित करना जारी रखेगा । अगली बार जब फ़ाइल की सामग्री प्रीप्रोसेसर द्वारा देखी जाती है FILE_H, तो उसके खिलाफ जांच झूठी होगी, इसलिए यह तुरंत स्कैन करेगा#endif और उसके बाद जारी रखेगा। यह पुनर्परिभाषित त्रुटियों को रोकता है।
और अपनी दूसरी चिंता को दूर करने के लिए:
एक सामान्य अभ्यास के रूप में C ++ प्रोग्रामिंग में हम विकास को दो फ़ाइल प्रकारों में अलग करते हैं। एक .h के विस्तार के साथ है और हम इसे "हेडर फ़ाइल" कहते हैं। वे आम तौर पर कार्यों, वर्गों, संरचनाओं, वैश्विक चर, टाइपडेफ़्स, प्रीप्रोसेसिंग मैक्रोज़ और परिभाषाओं आदि की एक घोषणा प्रदान करते हैं। मूल रूप से, वे सिर्फ आपको आपके कोड के बारे में जानकारी प्रदान करते हैं। फिर हमारे पास .cpp एक्सटेंशन है जिसे हम "कोड फ़ाइल" कहते हैं। यह उन कार्यों, वर्ग के सदस्यों, किसी भी संरचना के सदस्यों के लिए परिभाषा प्रदान करेगा, जिन्हें परिभाषा, वैश्विक चर आदि की आवश्यकता होती है। इसलिए .h फ़ाइल कोड घोषित करती है, और .cpp फ़ाइल घोषणाओं को लागू करती है। इस कारण से, हम आम तौर पर संकलन के दौरान प्रत्येक .cpp का संकलन करते हैंकिसी ऑब्जेक्ट में फ़ाइल करें और फिर उन ऑब्जेक्ट्स को लिंक करें (क्योंकि आप लगभग कभी भी एक .cpp फ़ाइल को दूसरी .cpp फ़ाइल में शामिल नहीं करते हैं )।
इन एक्सटर्नल को कैसे हल किया जाता है यह लिंकर के लिए एक काम है। अपने संकलक प्रक्रियाओं जब main.cpp , यह घोषणाओं कोड के लिए में हो जाता है class.cpp शामिल करके class.h । यह केवल यह जानना चाहिए कि ये फ़ंक्शन या चर क्या दिखते हैं (जो कि एक घोषणा आपको देती है)। तो यह आपकी main.cpp फाइल को किसी ऑब्जेक्ट फाइल में संकलित करता है (इसे main.obj कहते हैं )। इसी तरह, class.cpp को एक class.obj में संकलित किया जाता हैफ़ाइल। अंतिम निष्पादन योग्य का उत्पादन करने के लिए, एक लिंकर को उन दो ऑब्जेक्ट फ़ाइलों को एक साथ जोड़ने के लिए आमंत्रित किया जाता है। किसी भी बाहरी बाहरी चर या फ़ंक्शंस के लिए, कंपाइलर एक स्टब रखेगा जहां पहुंच होती है। लिंकर फिर इस स्टब को ले जाएगा और किसी अन्य सूचीबद्ध ऑब्जेक्ट फ़ाइल में कोड या चर की तलाश करेगा, और यदि यह पाया जाता है, तो यह दो ऑब्जेक्ट फ़ाइलों से कोड को आउटपुट फ़ाइल में जोड़ता है और स्टब को फ़ंक्शन के अंतिम स्थान के साथ बदल देता है या चर। इस तरह, main.cpp में आपका कोड फ़ंक्शंस को कॉल कर सकता है और class.cpp में वैरिएबल का उपयोग कर सकता है। IF और ONLY ifY THE DECLARED IN class.h ।
मुझे आशा है कि यह मददगार था।