एक ही नाम के साथ हेडर फ़ाइल को शामिल करके आप कैसे हल करते हैं जैसे किसी अन्य शीर्षलेख फ़ाइल को पहले से अप्रत्यक्ष रूप से किसी दूसरे के परिणामस्वरूप शामिल किया गया है?सी ++: अलग-अलग नामस्थानों से एक ही नाम के साथ एकाधिक शीर्षलेख फ़ाइलों को शामिल करें
उदाहरण के लिए:
// src/blah/a.hpp
#ifndef A_HPP
#define A_HPP
namspace blah
{
class A
{
}
}
#endif
// src/blah/b.hpp
#ifndef B_HPP
#define B_HPP
#includes "a.hpp"
namspace blah
{
class B
{
}
}
#endif
// src/foo/a.hpp
#ifndef A_HPP
#define A_HPP
namspace foo
{
class A
{
}
}
#endif
// src/foo/c.hpp
#ifndef C_HPP
#define C_HPP
#includes "../b.hpp"
#includes "a.hpp" // won't be included due to multiple inclusion prevention
namspace foo
{
class C
{
}
}
#endif
पिछले हेडर फाइल में, a.hpp क्योंकि शामिल किए जाने के पूर्वप्रक्रमक गार्ड शामिल नहीं किया जाएगा। वास्तव में, यह ठीक होना चाहिए हालांकि कक्षाएं अलग-अलग नामस्थानों में हैं। मुझे एहसास है कि आसान तरीका है foo/a.hpp का नाम बदलना या इसे एकाधिक समावेशी गार्ड में नकली नाम देना। क्या कोई बेहतर तरीका है?
संपादित मैं समझता हूँ कि आप #define और #ifndef निर्देशों (जैसे FOO_A_HPP और BLAH_A_HPP) में एक और वर्णनात्मक नाम का उपयोग करके इस समस्या का समाधान कर सकते हैं, लेकिन मैं जानना चाहता हूँ कि अगर सिफारिश की है या सबसे अच्छा तरीका है । क्या कुछ लोग एक बेहतर फ़ाइल नाम का उपयोग बेहतर समाधान के रूप में करने की सलाह देंगे या क्या इससे कोई फर्क नहीं पड़ता? आप परंपरा का उपयोग करके की सिफारिश करेंगे:
<NAMESPACE>_<CLASS>_HPP
<CLASS>_HPP
के बजाय सामान्य रूप में इन समस्याओं से बचने का एक बेहतर मौका देने के लिए?
इसे सी के रूप में क्यों टैग किया गया है? –
मैं हमेशा अपने गार्ड में नामस्थान डालता हूं। स्वचालित उपकरण एक GUID हेडर गार्ड के रूप में रखेंगे। पूरा मुद्दा यह है कि वे ** अद्वितीय होना चाहिए (न सिर्फ आपके प्रोजेक्ट में बल्कि सभी आयामों में सभी फ़ाइलों में अधिमानतः अद्वितीय होने पर अद्वितीय)। –