2009-12-09 9 views
5

आमतौर पर सी ++ में अच्छी कोडिंग शैली माना जाता है जहां आप मानक पुस्तकालय से प्रकार का उपयोग करते हैं? उदाहरण के लिए, यदि मेरे पास using namespace std; निर्देश है, तो क्या आप अभी भी लाइब्रेरी प्रकारों को पूरी तरह से योग्यता प्राप्त करने की उम्मीद करेंगे: std::string या क्या यह टाइप पहचानकर्ता के रूप में string का उपयोग करने के लिए स्वीकार्य है?सी ++ अच्छी कोडिंग शैली - हमेशा लाइब्रेरी प्रकारों को पूरी तरह अर्हता प्राप्त करें?

यदि आप पूरी तरह अर्हता प्राप्त करते हैं, तो क्या आप इसके पीछे तर्क का विस्तार कर सकते हैं? हालांकि string शायद काफी आम है पूरी तरह से में नाम स्थान में लाने से

using std::string; 
string whatever; 

किसी भी मामले पुस्तकालय डेवलपर्स में प्रकार के नाम से बचना चाहिए कि मानक वाले के साथ संघर्ष:

+2

ध्यान दें कि 'std :: स्ट्रिंग' पूरी तरह से योग्य नाम,' :: std :: स्ट्रिंग' पूरी तरह से दूसरी तरफ योग्य नहीं है । – dalle

उत्तर

14

शीर्षलेख फ़ाइलों में पूरी तरह से योग्यता प्राप्त करें। .cpp फ़ाइलों में नामस्थान आयात करें।

एक सरल # शामिल

+0

यह आपको किसी भी व्यक्ति पर नेमस्पेस को मजबूर करने से रोकता है यदि वे कभी भी आपकी हेडर फ़ाइल को शामिल करने का निर्णय लेते हैं। यह कुछ भ्रम पैदा कर सकता है अगर वे सोच रहे हैं "जहां भगवान के नाम में मैंने उस नामस्थान का उपयोग किया था?" और वे किसी और के कोड को शामिल करने के बारे में नहीं सोचते हैं। –

+2

मैं वैकल्पिक रूप से स्रोत फ़ाइलों में नेमस्पेस आयात करता हूं, लेकिन यहां महत्वपूर्ण और सही बिंदु कभी भी हेडर फ़ाइल में "नेमस्पेस का उपयोग करके" घोषणा नहीं करता है। –

13

मैं का उपयोग कर पसंद करते हैं।।

मानक के अलावा पुस्तकालयों के लिए यदि मैं घोंसला नामस्थान बहुत लंबा नहीं है, तो यह योग्यता प्राप्त करना पसंद है, अगर यह सिर्फ एक सार्थक नाम पर टाइप किया गया है जिसमें पुस्तकालय का नाम या ऐसा कुछ शामिल है।

+2

नामस्थान का पूरा बिंदु यह है कि आपको अन्य पुस्तकालयों, यहां तक ​​कि मानक वाले लोगों द्वारा उपयोग किए जाने वाले नामों के बारे में चिंता करने की ज़रूरत नहीं है। –

+4

नामों का चयन करना जो पहले से ही आपकी पुस्तकालय के लिए मानक में परिभाषित हैं, वास्तव में एक बुरा विचार है। इलगल नहीं, वेक्टर पढ़ने वाले किसी भी व्यक्ति के बारे में एक बुरा विचार std :: vector पर विचार करेगा। –

1

आम तौर पर जब मैं हेडर फ़ाइलों से निपटता हूं तो मैं using namespace x का उपयोग करने के बजाय नामस्थानों को पूरी तरह अर्हता प्राप्त करूंगा। स्रोत फाइलें उस नामस्थान को नहीं मानना ​​चाहती हैं और आपको उन स्रोत फ़ाइलों पर मजबूर नहीं करना चाहिए जिनमें आपकी हेडर फ़ाइल शामिल है।

मैं using namespace x दोनों करता हूं और व्यक्तिगत निर्णय कॉल के आधार पर नेमस्पेस को पूरी तरह अर्हता प्राप्त करता हूं कि क्या मैं कई बार बार-बार उपयोग करूँगा या स्रोत फ़ाइलों में नहीं।

+0

अरे, मुझे 42 सेकंड – sdellysse

+0

तक पंच पर हराया मुझे लगता है कि यह गलत है। आपको कभी भी एक्स का उपयोग नहीं करना चाहिए; किसी भी हेडर फ़ाइल में। यदि ये पौराणिक उपयोगकर्ता निर्देशिकाओं का उपयोग करके उपयुक्त प्रदान नहीं करना चाहते हैं, तो उनके लिए कठिन भाग्य। –

+0

@ नील बटरवर्थ: मैं सहमत हूं, और मैंने कथन को और अधिक बलवान होने के लिए संशोधित किया। –

1

namespace से भरा हुआ होने से वैश्विक नामस्थान रहता है मूल रूप से इस तरह के समारोह, वर्ग, और चर के रूप में संघर्ष प्रतीक नाम कम करने के लिए शुरू की है। यह ठीक है कि आप string का उपयोग std::string से करें जब तक कि आपकी अपनी लाइब्रेरी में string अपनी जगह पर न हो। मैं लगभग std जैसे बहुत आम नेमस्पेस का उपयोग नहीं कर रहा हूं।

0

पूरी तरह से व्यक्तिपरक प्रश्न: मैं केवल स्ट्रिंग का उपयोग करने के लिए स्वीकार्य कहूंगा। आईडीई/कंपाइलर आपके मतलब का पता लगाने के लिए पर्याप्त चालाक हैं। यदि आपके पास समान नाम वाले ऑब्जेक्ट हैं, उदाहरण के लिए 2 स्ट्रिंग प्रकार। फिर आपके पास एक अलग समस्या है क्योंकि संकलक को पता नहीं चलेगा कि आपका क्या मतलब है और कोडर को यह नहीं पता होगा कि आपका क्या मतलब है।

लाइब्रेरी नामों का उपयोग न करने का अन्य कारण कोड को अव्यवस्थित करने के कारण है: सी # system.xml.xmltextreader में केवल ओवरकिल है। XmlTextReader यह है कि यह क्या है के तहत पर्याप्त है। जहां वह स्थित है लगभग कभी मुद्दा

+0

आईडीई "चालाक पर्याप्त" हो सकता है, लेकिन संकलक नहीं होगा। –

+0

कंपाइलर अब चालाक क्यों नहीं होगा कि स्ट्रिंग स्ट्रिंग :: स्ट्रिंग के समान है यदि आप 'नेमस्पेस std का उपयोग करते हुए' का उपयोग करते हैं। यदि आपके पास एक ही नाम के साथ कई प्रकार हैं, तो कंपाइलर चालाक नहीं होगा, दूसरी पंक्ति देखें। – RvdK

1

है मैं दो नियमों का पालन करते हैं:

  • हेडर फाइल में, आप पूर्ण नाम स्थान के साथ प्रकार के नाम अर्हता प्राप्त करना चाहते हैं और कभी नहीं, कभी की तरह कुछ रखना चाहते हैं using namespace std; क्योंकि यह अप्रत्याशित नामकरण विवादों के कारण दिलचस्प समस्याएं पैदा कर सकता है/आपको 1am पर ट्रैक करने की आवश्यकता होगी।
  • कार्यान्वयन फ़ाइलों में, मैं using std::string; या इसी तरह का उपयोग करके अन्य नामस्थानों से उपयोग किए जाने वाले प्रतीकों को खींचने की कोशिश करता हूं।दरअसल, मैं इसके साथ 100% संगत नहीं हूं क्योंकि मैं अक्सर std नेमस्पेस में नहीं खींचता हूं, लेकिन प्रोजेक्ट नेमस्पेस में खींचता हूं लेकिन यह व्यक्तिगत वरीयता है। कभी भी, किसी भी #include से ऊपर कभी भी using namespace somethingorother; डालें।
+1

मैं इन नियमों का उपयोग एक अतिरिक्त के साथ करता हूं: कार्यान्वयन फ़ाइल में "उपयोग" खंड के लिए सबसे बड़ा स्वीकार्य दायरा एक कार्य है। – paxos1977

+0

यह एक बुरा विचार नहीं है; मैंने इसका उपयोग शुरू कर दिया है लेकिन मैं इसे समग्र उपयोग पर निर्भर करता हूं। उदाहरण के लिए, फ़ंक्शन स्कोप पर std :: स्ट्रिंग का उपयोग करके थोड़ा कठिन हो सकता है ताकि इसके बजाय फ़ाइल स्कोप में स्थानांतरित हो सके। –

0

सामान्य तौर पर, मैं using std::string; string hello; क्या Jimenez जैसा कि पहले उल्लेख के रूप में की तरह निर्देश का उपयोग कर (1) पसंद करते हैं; (2) मैं भी एक गुमनाम नाम स्थान का उपयोग बाद में बस क्या इसके लायक है के लिए नाम स्थान के निर्देश का उपयोग कर का उपयोग अपने गुमनाम नेम स्पेस में इस namespace { using namespace std; // or using std::string string blah_blah_blah; }

+0

बस इसके लायक होने के लिए, 'निर्देश का उपयोग करना' नामस्थान x का उपयोग करने जैसा है। 'Std :: string' का उपयोग करना एक' घोषणा का उपयोग कर 'है। –

+0

धन्यवाद जेरी, सुधार की सराहना करते हैं। –

3

की तरह सभी के नाम आयात करने के लिए, आपको कुछ बातों का आप कर सकते हैं नामांकन निर्देश के साथ एक नामस्थान खींचकर आप नामों को अर्हता प्राप्त करके नहीं कर सकते हैं। कैनोलिक उदाहरण शायद एक सामान्य सॉर्ट फ़ंक्शन लिख रहा है। यदि swap को सॉर्ट किए जाने वाले प्रकार के लिए परिभाषित किया गया है, तो आप इसका उपयोग करना चाहते हैं, लेकिन यदि उसके पास swap नहीं है, तो आप std::swap का उपयोग करना चाहते हैं।

इसे पूरा करने के आप की तरह अपने कोड लिख सकते हैं: अगर वहाँ जो कुछ भी प्रकार हल कर किया जा रहा है की नाम स्थान में एक swap है,

using namespace std; 
// ... 
template <class T> 
void my_sort(std::vector<T> &x) { 
    // ... 
    if (x[j] < x[k]) 
     swap(x[j], x[k]); 

अब, यह तर्क निर्भर देखने के द्वारा पाया जा जाएगा। यदि नहीं है, std::swap पाए जाएंगे क्योंकि आपने इसे उपयोग निर्देश के साथ दृश्यमान बना दिया है।

6

पूरा बिंदु भ्रम से बचने और स्पष्ट कोड उत्पन्न करने के लिए होना चाहिए। नामांकन नामांकन कुछ मामलों में किसी फ़ंक्शन या कक्षा की उत्पत्ति को खराब कर सकता है, लेकिन हमेशा पूर्ण नामस्थान जोड़ना असहनीय हो सकता है। हेडर फाइल में

  • बचें using namespace
  • "स्पष्ट" पुस्तकालयों के लिए स्रोत में उपयोग using namespace (std जैसे, या पुस्तकालय के लिए एक परीक्षण कार्यक्रम में परीक्षण करने के लिए)
  • आप अपने स्रोत में उर्फ ​​नामस्थान इसे रखने के लिए कर सकते हैं लघु और पठनीय:

उदाहरण

namespace fs = boost::filesystem; 
bool fileExists = fs::exists(fs::path(filePath)); 

संपादित करें, पूर्णता के लिए: using namespace हेडर फाइल में एक गैर स्पष्ट रास्ता (पहले से ही इस सूत्र में इस बात का 'nuf स्पष्टीकरण) में आयातित namepaces साथ स्रोत फ़ाइलों को प्रदूषित करता है।

0

मैं हमेशा शीर्षकों के भीतर पूरी तरह अर्हता प्राप्त करता हूं। मैंने हेडर में "उपयोग ..." कथन कभी नहीं डाले।

मेरी प्राथमिकता

0

आप पूरी तरह से योग्य नहीं हैं लेकिन यदि संगठन मानक कार्यान्वयन फ़ाइलों के भीतर "का उपयोग कर ..." बयान मैं ऐसा करेंगे शामिल करने के लिए है, पूरी तरह से कार्यान्वयन फाइलों में अर्हता प्राप्त करने के रूप में अच्छी तरह है, , हेडर से सीपीपी फाइलों या इसके विपरीत इनलाइन विधियों को स्थानांतरित करते समय आपको बड़ी परेशानी होगी, और आप निश्चित रूप से अपनी परियोजनाओं में एक शैली चाहते हैं।

अन्यथा यह कोई समस्या नहीं है, कभी-कभी मैं कथन का उपयोग करने के बावजूद योग्यता प्राप्त करता हूं।हेडर में यह एक समस्या है जब तक यह दायरे के भीतर है:

// somefile.h 
namespace VisionMap 
{ 
    namespace X 
    { 
     using namespace Y; // Does not impact the header's user, 
           // as would if it was in the global scope. 
    } 
} 
संबंधित मुद्दे