इनलाइन नेमस्पेस एक वैरिएबल वर्जनिंग फीचर है, जो वर्जनिंग सिंबल के समान है , लेकिन विशुद्ध रूप से C बाइनरी निष्पादन योग्य प्रारूप (यानी प्लेटफॉर्म-विशिष्ट) की विशेषता के बजाय C ++ 11 लेवल (यानी क्रॉस-प्लेटफॉर्म) पर पूरी तरह से लागू किया गया है।
यह एक ऐसा तंत्र है जिसके द्वारा एक पुस्तकालय लेखक एक नेस्टेड नेमस्पेस लुक बना सकता है और कार्य कर सकता है जैसे कि उसके सभी घोषणापत्र आसपास के नेमस्पेस में थे (इनलाइन नेमस्पेस को नेस्टेड किया जा सकता है, इसलिए "अधिक-नेस्टेड" नाम पहले गैर के लिए सभी तरह से नष्ट हो जाते हैं) -इनलाइन नेमस्पेस और देखो और कार्य करें जैसे कि उनकी घोषणाएं किसी भी नामस्थान के बीच में थीं, भी)।
एक उदाहरण के रूप में, एसटीएल के कार्यान्वयन पर विचार करें vector
। अगर हमारे पास C ++ की शुरुआत से इनलाइन नामस्थान हैं, तो C ++ 98 में हेडर <vector>
इस तरह लग सकता है:
namespace std {
#if __cplusplus < 1997L // pre-standard C++
inline
#endif
namespace pre_cxx_1997 {
template <class T> __vector_impl; // implementation class
template <class T> // e.g. w/o allocator argument
class vector : __vector_impl<T> { // private inheritance
// ...
};
}
#if __cplusplus >= 1997L // C++98/03 or later
// (ifdef'ed out b/c it probably uses new language
// features that a pre-C++98 compiler would choke on)
# if __cplusplus == 1997L // C++98/03
inline
# endif
namespace cxx_1997 {
// std::vector now has an allocator argument
template <class T, class Alloc=std::allocator<T> >
class vector : pre_cxx_1997::__vector_impl<T> { // the old impl is still good
// ...
};
// and vector<bool> is special:
template <class Alloc=std::allocator<bool> >
class vector<bool> {
// ...
};
};
#endif // C++98/03 or later
} // namespace std
मूल्य के आधार पर __cplusplus
, एक या दूसरे vector
कार्यान्वयन को चुना जाता है। अपने codebase पूर्व सी ++ में 98 बार लिखा गया था, और आप पाते हैं कि सी ++ के 98 संस्करण हैं vector
जब आप अपने संकलक उन्नयन आप के लिए मुसीबत खड़ी कर रहा है, "सभी" आप क्या करना है के लिए संदर्भ मिल रहा है std::vector
में आपके कोडबेस और उन्हें द्वारा प्रतिस्थापित करें std::pre_cxx_1997::vector
।
अगले मानक आओ, और एसटीएल विक्रेता बस फिर प्रक्रिया को दोहराता है, के लिए एक नया नाम स्थान को शुरू करने std::vector
के साथ emplace_back
समर्थन (जो सी की आवश्यकता है ++ 11) और है कि एक iff इनलाइनिंग __cplusplus == 201103L
।
ठीक है, तो मुझे इसके लिए एक नई भाषा सुविधा की आवश्यकता क्यों है? मैं पहले से ही एक ही प्रभाव है, नहीं कर सकते हैं?
namespace std {
namespace pre_cxx_1997 {
// ...
}
#if __cplusplus < 1997L // pre-standard C++
using namespace pre_cxx_1997;
#endif
#if __cplusplus >= 1997L // C++98/03 or later
// (ifdef'ed out b/c it probably uses new language
// features that a pre-C++98 compiler would choke on)
namespace cxx_1997 {
// ...
};
# if __cplusplus == 1997L // C++98/03
using namespace cxx_1997;
# endif
#endif // C++98/03 or later
} // namespace std
के मूल्य के आधार पर __cplusplus
, मुझे या तो एक या अन्य कार्यान्वयन मिलते हैं।
और आप लगभग सही हो जाएंगे।
निम्नलिखित मान्य C ++ 98 उपयोगकर्ता कोड पर विचार करें (यह std
पहले से ही C ++ 98 में नामस्थान में रहने वाले टेम्पलेट्स को पूरी तरह से विशेषज्ञ करने की अनुमति दी गई थी ):
// I don't trust my STL vendor to do this optimisation, so force these
// specializations myself:
namespace std {
template <>
class vector<MyType> : my_special_vector<MyType> {
// ...
};
template <>
class vector<MyOtherType> : my_special_vector<MyOtherType> {
// ...
};
// ...etc...
} // namespace std
यह पूरी तरह से मान्य कोड है जहां उपयोगकर्ता एक प्रकार के सेट के लिए वेक्टर के अपने स्वयं के कार्यान्वयन की आपूर्ति करता है, जहां वह स्पष्ट रूप से एसटीएल के (उसकी प्रतिलिपि) में पाए गए एक से अधिक कुशल कार्यान्वयन जानता है।
लेकिन : जब किसी टेम्प्लेट की विशेषज्ञता होती है, तो आपको ऐसा करने की आवश्यकता होती है कि नेमस्पेस में यह घोषित किया गया था। स्टैंडर्ड का कहना है कि vector
यह नामस्थान में घोषित किया गया है std
, इसलिए उपयोगकर्ता सही प्रकार से विशेषज्ञ की अपेक्षा करता है।
यह कोड एक गैर-संस्करण नामस्थान के std
साथ, या C ++ 11 इनलाइन नामस्थान सुविधा के साथ काम करता है , लेकिन उपयोग की गई संस्करण की चाल के साथ नहीं using namespace <nested>
, क्योंकि यह कार्यान्वयन विवरण को उजागर करता है जिसमें सही नाम स्थान vector
परिभाषित नहीं किया गया था std
।
अन्य छेद हैं जिनके द्वारा आप नेस्टेड नेमस्पेस का पता लगा सकते हैं (नीचे टिप्पणियां देखें), लेकिन इनलाइन नेमस्पेस उन सभी को प्लग करते हैं। और यही सब कुछ है। भविष्य के लिए बेहद उपयोगी है, लेकिन AFAIK स्टैंडर्ड अपने स्वयं के मानक पुस्तकालय के लिए इनलाइन नेमस्पेस नामों को निर्धारित नहीं करता है (मैं इस पर गलत साबित होना पसंद करूंगा, हालांकि), इसलिए इसका उपयोग केवल तीसरे पक्ष के पुस्तकालयों के लिए किया जा सकता है, न कि मानक स्वयं (जब तक कि कंपाइलर विक्रेता नामकरण योजना पर सहमत नहीं हो जाते हैं)।
using namespace V99;
स्ट्रॉस्ट्रुप के उदाहरण में काम क्यों नहीं किया जाता है।