2008-11-26 16 views
14

में प्रकार जोड़ना std नामस्थान में प्रकार जोड़ने के लिए स्वीकार्य है। उदाहरण के लिए, मुझे एक टीसीएचएआर-अनुकूल स्ट्रिंग चाहिए, तो क्या निम्नलिखित स्वीकार्य है?std namespace

#include <string> 

namespace std 
{ 
    typedef basic_string<TCHAR> tstring; 
} 

या मुझे अपना नामस्थान उपयोग करना चाहिए?

उत्तर

17

नहीं ... नामस्थान के बिंदु का हिस्सा अपग्रेड पर नाम टकराव को रोकने के लिए है।

यदि आप स्टडी नेमस्पेस में चीजें जोड़ते हैं, तो यदि आपका नाम उसी नाम से कुछ जोड़ने का निर्णय लेता है तो लाइब्रेरी की अगली रिलीज के साथ आपका कोड टूट सकता है।

+2

यह मानक, afaik का भी उल्लंघन करता है। Std नेमस्पेस पवित्र है। (मौजूदा std कार्यों के विशेषज्ञों के अलावा) :) – jalf

3

आपको अपने पुस्तकालय में कोड जोड़ने के रूप में अपना नामस्थान उपयोग करना चाहिए केवल उन उपयोगकर्ताओं को भ्रमित कर देगा जो उस अतिरिक्त जानकारी के बारे में जानकारी के लिए ऑनलाइन देखेंगे।

एसडीडी में जो कुछ भी है वह केवल मानक पुस्तकालय होना चाहिए और कुछ भी नहीं।

+0

मुझे विश्वास नहीं है कि यह उपयोगकर्ताओं को भ्रमित करेगा - वास्तव में वे एक std :: basic_string प्रकार std में होने की उम्मीद कर सकते हैं। कठिन कॉल मुझे लगता है। – Rob

+0

नहीं, क्रीम सही है। आपको std नेमस्पेस में कुछ भी नहीं जोड़ना चाहिए। उपयोगकर्ता * मूल_स्ट्रिंग को std में होने की उम्मीद कर सकते हैं, लेकिन यह एसडीडी लाइब्रेरी का हिस्सा नहीं है और उन्हें किसी दिए गए एसडीडी कार्यान्वयन के लिए प्रकाशित दस्तावेज़ीकरण में कुछ भी नहीं मिलेगा। सही तरीका है अपने स्वयं के एनएस का उपयोग करना। –

+0

मुझे इसे एक देखना था। 'basic_string' को वास्तव में आईएसओ/आईईसी 14882: 1 99 8 के पृष्ठ 384 पर' std' नेमस्पेस के हिस्से के रूप में परिभाषित किया गया है। – Zhro

2

आधिकारिक तौर पर, मानक कहता है कि "अनिर्धारित व्यवहार" है, और सभी प्रकार की ग़लत चीजें हो सकती हैं।

प्रैक्टिस में, यह ठीक काम करेगा, लेकिन आपको अभी भी ऐसा नहीं करना चाहिए। भ्रमित लोगों के अलावा यह आपको क्या खरीदता है कि संकलक द्वारा कुछ प्रदान किया जाता है?

15

केवल विशेषज्ञता की अनुमति है। तो उदाहरण के लिए, आपको अपने प्रकार के लिए std::numeric_limits विशेषज्ञता देने की अनुमति है। और यह निश्चित रूप से नेमस्पेस std:: में होना चाहिए। लेकिन आपकी टाइपिफ एक विशेषज्ञता नहीं है जिससे अपरिभाषित व्यवहार हो रहा है।

+0

[इस उत्तर] के अनुसार (http://stackoverflow.com/a/2684544/1468366), 'स्वैप' कार्यान्वयन को अब 'std' में नहीं जाना चाहिए, जैसा कि 'स्वैप' का उपयोग करके एल्गोरिदम तर्क-निर्भर लुकअप पर निर्भर होना चाहिए। – MvG

+0

@MvG कि उत्तर सही है। मेरा उदाहरण नहीं है और अच्छा नहीं था। मैं इसे बदल दूंगा। –

+0

इस संबंध में 'numeric_limits'' swap' से अलग क्यों है? –

1

मैं अन्य उत्तरों के साथ पूरी तरह से सहमत हूं कि दुर्भाग्यपूर्ण नाम टकराव से बचने के लिए आपको अपने नामों को अपने नामस्थान में रखना चाहिए।

हालांकि, मैं कभी-कभी सटीक करना चाहता था, आप std namespace में सामान जोड़ सकते हैं (और चाहिए!)। उदाहरण के लिए std :: स्वैप विधि के टेम्पलेट विशेषज्ञता के लिए यह मामला है, जिसका उपयोग वस्तुओं को स्वैप करने के लिए एक समान तरीका प्रदान करने के लिए किया जाता है। इस मामले के बारे में अधिक जानकारी के लिए, आप non-throwing swap idiom के बारे में पढ़ सकते हैं।

13

[C++11: 17.6.4.2.1/1]: एक सी ++ प्रोग्राम के व्यवहार अपरिभाषित अगर यह std नाम स्थान या नाम स्थान std के भीतर एक नाम स्थान के लिए करने के लिए जब तक अन्यथा निर्दिष्ट घोषणाओं या परिभाषाओं कहते है। एक प्रोग्राम किसी भी मानक लाइब्रेरी टेम्पलेट के लिए किसी भी मानक लाइब्रेरी टेम्पलेट के लिए केवल टेम्पलेट विशेषज्ञता को जोड़ सकता है, यदि घोषणा उपयोगकर्ता द्वारा परिभाषित प्रकार पर निर्भर करती है और विशेषज्ञता मूल टेम्पलेट के लिए मानक लाइब्रेरी आवश्यकताओं को पूरा करती है और स्पष्ट रूप से प्रतिबंधित नहीं है।

2

यह एक दिलचस्प सवाल है क्योंकि यह परियोजना और इंजीनियरों के स्वीकार्य कोडिंग मानकों के लिए पूरी तरह से व्यक्तिपरक है।

एक प्रोग्रामर के लिए, क्यों नहीं ... बस सावधान रहें।

टीमों के लिए, एक मानक ...

बनाने के एक पार मंच परियोजना के लिए, नरक, हाँ।

अन्यथा, nawdawg।

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