हेडर सी में एक-दूसरे को शामिल करते हैं
सी में, हेडर के लिए कभी-कभी एक-दूसरे को शामिल करना आवश्यक होता है। हालाँकि, इससे समस्याएँ पैदा हो सकती हैं, खासकर जब #include स्टेटमेंट्स को रखने की बात आती है।
मैक्रोज़ के अंदर या बाहर
सामान्य तौर पर, #include स्टेटमेंट्स को रखना चाहिए मैक्रोज़ के अंदर रखा जाना चाहिए, जैसे #ifndef में गार्ड शामिल हैं। यह संकलन के दौरान अनंत पुनरावृत्ति को रोकता है, जैसा कि निम्नलिखित उदाहरण में दिखाया गया है:
// A.h
#ifndef A_H_
#define A_H_
#include "B.h"
class A {
private:
B b;
public:
A() : b(*this) {}
};
#endif // A_H_
// B.h
#ifndef B_H_
#define B_H_
#include "A.h"
class B {
private:
A& a;
public:
B(A& a) : a(a) {}
};
#endif // B_H_
#include स्टेटमेंट को मैक्रोज़ के बाहर रखने से कंपाइलर में A.h और B.h. के बीच पारस्परिक समावेशन के कारण अनिश्चित काल तक पुनरावृत्ति होती है।
अघोषित प्रकार
हालांकि, #include स्टेटमेंट को मैक्रोज़ के अंदर रखने से अघोषित प्रकार की समस्याएं हो सकती हैं। उदाहरण के लिए, निम्नलिखित कोड पर विचार करें:
// A.h
#ifndef A_H_
#define A_H_
class A; // Forward declaration
#include "B.h"
class A {
private:
B b;
public:
A() : b(*this) {}
};
#endif // A_H_
// B.h
#ifndef B_H_
#define B_H_
#include "A.h"
class B {
private:
A a; // Directly include A
public:
B(A& a) : a(a) {}
};
#endif // B_H_
इस मामले में, कंपाइलर शिकायत करेगा कि A, B.h के भीतर एक अघोषित प्रकार है। ऐसा इसलिए है क्योंकि B.h को शामिल करने पर A.h में फॉरवर्ड डिक्लेरेशन दिखाई नहीं देता है।
समाधान: फॉरवर्ड डिक्लेरेशन
इन मुद्दों को हल करने के लिए, फॉरवर्ड डिक्लेरेशन का उपयोग करना सबसे अच्छा है और जहां आवश्यक हो वहां पूरी परिभाषा वाला हेडर शामिल करें। इस उदाहरण में, B की परिभाषा से पहले A की अग्रेषित घोषणा को B.h में जोड़ा जाना चाहिए:
// B.h
#ifndef B_H_
#define B_H_
class A; // Forward declaration
#include "A.h"
class B {
private:
A a; // Directly include A
public:
B(A& a) : a(a) {}
};
#endif // B_H_
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3