2014-07-04 22 views
8

में "नेमस्पेस का उपयोग करके" का दायरा सीमित करना मैं एसटीएल का उपयोग कर एक छोटे से व्यक्तिगत सी ++ प्रोजेक्ट पर काम कर रहा हूं। मुझे अपने हेडर फाइलों में सभी जगहों पर "std::" पसंद नहीं है, क्योंकि मुझे लगता है कि यह पठनीयता में बाधा डालता है, लेकिन साथ ही मैं हेडर फ़ाइल में using namespace std डालकर खुद को समस्याएं उत्पन्न नहीं करना चाहता हूं।हेडर फ़ाइल

तो मैं वहाँ using घोषणा के दायरे को सीमित करने का कोई तरीका है, इतना है कि यह मेरी हैडर फ़ाइल की सामग्री पर लागू होता है सोच रहा हूँ, लेकिन फ़ाइलों को शामिल करने के लिए लागू नहीं है। मैंने इस

{ 
    using namespace std; 

    // header file contents here 
} 

पर ऐसा लगता है लेकिन ऐसा लगता है कि इस तरह के दायरे को पेश करने की अनुमति किसी फ़ंक्शन परिभाषा के बाहर नहीं है। क्या मेरे पास ऐसा करने का कोई तरीका है?

कृपया ध्यान दें: मुझे वास्तव में यह जानने में कोई दिलचस्पी नहीं है कि यह एक अच्छा विचार है, मैं सिर्फ यह जानना चाहता हूं कि यह किया जा सकता है या नहीं।

+1

मेरा गलत जवाब हटा दिया गया है। क्षमा याचना। आदत से मैं हमेशा शीर्षकों (और यहां तक ​​कि सीपीपी फाइलों में) में नामों को पूरी तरह अर्हता प्राप्त करता हूं। कोड बेस के लिए यह बहुत आम है जो अपने स्वयं के वेक्टर घोषित करते हैं, इसलिए अस्पष्टता से बचने के लिए std :: vector को देखकर यह सहायक होता है। यह यद्यपि आपके प्रश्न का उत्तर देने में मदद नहीं करता है। – M2tM

+0

@ एम 2 टीएम धन्यवाद, कोई समस्या नहीं। – Nathaniel

उत्तर

5

हाँ, मुझे लगता है कि किया जा सकता है।

यह प्राप्त करने के लिए कि आपको अपना नामस्थान बनाना होगा। मैंने कुछ कोड लिखा है जो अपेक्षित के अनुसार काम कर रहा है।

हैडर फ़ाइल लगता है:

#include <iostream> 
namespace my_space { 
    using namespace std; 

    void mprint() 
    { 
     /* 
     * This is working. It means we can access 
     * std namespace inside my_space. 
     */ 
     cout << "AAA" << endl; 
    } 
}; 

कार्यान्वयन फ़ाइल लगता है:

#include "my_header.h" 

int main() 
{ 

    /* 
    * Working Fine. 
    */ 
    my_space::mprint(); 

    /* 
    * It gives a compile time error because 
    * it can't access the std namespace 
    */ 
    cout << "CHECK" << endl; 
    return 0; 
} 

कृपया मुझे पता है कि अगर यह आपकी आवश्यकता को पूरा नहीं करता है। हम उस पर काम कर सकते हैं।

+3

ध्यान दें कि इसमें अनपेक्षित परिणाम हो सकते हैं। 'नेमस्पेस ब्लाह का उपयोग करके' नाम स्थापित करके; हेडर फ़ाइल में किसी अन्य नेमस्पेस के भीतर आप जानबूझकर उस नामस्थान में * सबकुछ * में खींच रहे हैं जिसे वर्तमान अनुवाद इकाई में शामिल किया गया है, और अब * आपके * हेडर सहित, लेकिन नहीं आगे की। एक ही शीर्षलेख सहित एक अलग अनुवाद इकाई हेडर (आपका) के साथ उपयोग किए गए नामस्थान में घोषणाओं और परिभाषाओं को पूरी तरह से अनजान होने के कारण खींच सकती है। यह 'Namspace' का उपयोग करने के कई कारणों में से एक है * आदर्श * के बाद * टीयू में शामिल सभी के लिए उपयुक्त है। – WhozCraig

+0

मैं इस तरह के समाधान के साथ जा सकता हूं, लेकिन समस्या यह है कि यह एक जगह में केवल एक दूसरे में पॉप अप करने के लिए शिकन को धक्का देता है। मेरा हेडर फ़ाइल कोड अच्छी तरह से 'std ::' से मुक्त है, लेकिन इसका उपयोग करने वाला कोड 'my_space ::' के साथ peppered है। यदि मैं नेमस्पेस my_space' का उपयोग कर रहा हूं, तो यह 'std' से वैश्विक नामस्थान में सब कुछ आयात करेगा, जो हम बचने की कोशिश कर रहे थे। – Nathaniel

+0

मैं आपके साथ नथनील से सहमत हूं। लेकिन आपको एक जगह या दूसरी जगह कड़वी गोली निगलनी है। –

3

नहीं, यह नहीं किया जा सकता है। हेडर में एक दायरा पेश करने का आपका प्रयास ठीक से विफल रहा क्योंकि हेडर स्कोप जैसी कोई चीज़ नहीं है - हेडर फ़ाइलों में संकलन के दौरान कोई विशेष स्थिति नहीं है। अनुवाद इकाइयां प्रीप्रोसेसर के साथ किए जाने के बाद प्राप्त स्रोत फ़ाइल होती हैं। इस प्रकार, सभी include निर्देश केवल संबंधित शीर्षलेख फ़ाइलों का विस्तार करते हैं। यह आपको किसी भी तरह से हेडर फ़ाइल संदर्भ-विशिष्ट की सामग्री बनाने से रोकता है।

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