मैं एक नाम स्थान का "उपयोग" कैसे कर सकता हूं?


86

मेरी विकास प्रणाली (कोडगियर सी ++ बिल्डर) की योनि में से एक यह है कि ऑटो-जेनरेटेड हेडर में से कुछ ...

using namespace xyzzy

... उनमें वक्तव्य, जो मेरे कोड पर प्रभाव डालते हैं जब मैं कम से कम चाहता हूं या इसकी उम्मीद करता हूं।

क्या ऐसा कोई तरीका है जिससे मैं इससे बचने के लिए किसी पिछले "कथन का उपयोग कर" को रद्द / ओवरराइड कर सकता हूं।

शायद...

unusing namespace xyzzy;

3
आपको शायद उनके QC सिस्टम के साथ बग रिपोर्ट खोलनी चाहिए
क्रिश कुमलर

2
BTW, जो ऑटो उत्पन्न हेडर ये हैं?
क्रिश कुमलर

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

जवाबों:


59

नहीं। लेकिन एक संभावित समाधान है: यदि आप अपने स्वयं के नामस्थान में निर्देश को शामिल करते हैं, तो इस तरह ...

namespace codegear {
    #include "codegear_header.h"
} // namespace codegear

... तो उस हेडर के भीतर किसी भी निर्देशों का उपयोग करने के प्रभाव बेअसर हैं।

यह कुछ मामलों में समस्याग्रस्त हो सकता है। इसीलिए हर C ++ स्टाइल गाइड एक हेडर फ़ाइल में "नेमस्पेस का उपयोग" निर्देश नहीं डालने की दृढ़ता से सलाह देता है।


1
सामान्य तौर पर, यह एक भयानक विचार है। C ++ हेडर को वैकल्पिक नाम स्थान में शामिल करने का इरादा नहीं है जैसा कि यहाँ इस्तेमाल किया गया था।
हारून

24
हेडर फ़ाइल में भी एक निर्देश का उपयोग करना एक भयानक विचार है। यह बस उस समस्या को कम करता है।
हेड गीक

4
शीर्षलेख को अपने नामस्थान में रखना एक समाधान नहीं है क्योंकि यह उस पुस्तकालय में घोषणाओं के अर्थ को बदल देता है। (-1)
रिचर्ड कॉर्डन

4
यह पूरी तरह से हेडर में घोषित किए जाने पर निर्भर करता है।
हेड गीक

1
यह ठीक नहीं है कि यह अपरिभाषित व्यवहार क्यों है।
क्रिश कुमलर

56

नहीं, तुम नहीं कर सकते unuse एक नाम स्थान। केवल एक चीज जो आप कर सकते हैं using namespace-statement को वह दायरा सीमित करने के लिए एक ब्लॉक डाल रहा है ।

उदाहरण:

{
    using namespace xyzzy;

} // stop using namespace xyzzy here

हो सकता है कि आप उस टेम्प्लेट को बदल सकें जो आपके ऑटो-जेनरेट किए गए हेडर का उपयोग किया जाता है।


क्या आप किसी ब्लॉक को इस तरह शामिल कर सकते हैं?
ग्रहण

हां यह ऑटो जनरेट कोड के साथ नहीं होगा। Byt mybe वह ऑटो जनरेट कोड के लिए टेम्पलेट बदल सकता है?
जे.के.

हाँ, यह वास्तव में उस समस्या को संबोधित नहीं करता है जो वह नेमस्पेस के उपयोग से हेडर की है।
किप

दुर्भाग्य से यह सच नहीं है। इसे
एडम

नामस्थान xyzzy {const int {{नाम स्थान xyzzy का उपयोग कर; } // यहाँ नेमस्पेस xyzzy का उपयोग करना बंद करें
आदम

17

आप संघर्षों पर स्पष्ट नाम स्थान का उपयोग करके अटक सकते हैं:

string x; // Doesn't work due to conflicting declarations
::string y; // use the class from the global namespace
std::string z; // use the string class from the std namespace

10

भविष्य के संदर्भ के लिए: चूंकि XE संस्करण में एक नया मान है, जिससे आप using namespace System;भयभीत int से बचने के लिए #define कर सकते हैं: DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE


लेकिन यह ठीक से काम नहीं कर रहा है। कम से कम सभी मामलों में मैंने कोशिश की (बीसीबी 6 के साथ)। मैं तब संघर्ष पर स्पष्ट नाम स्थान जोड़ने पर वापस आ जाता था और - इससे भी बदतर - प्रकार नाम संघर्ष से बचने के लिए एक हेडर शामिल करता हूं ...
वुल्फ

6

कैसे उत्पन्न होने के बाद उत्पन्न हेडरों को संशोधित करने के लिए आपकी बिल्ड प्रक्रिया के भाग के रूप में sed, पर्ल या कुछ अन्य कमांड लाइन टूल का उपयोग किया जाता है, लेकिन इससे पहले कि वे उपयोग किए जाते हैं?


1

विजुअल स्टूडियो 2005 के साथ त्वरित प्रयोग से पता चलता है कि आप उन हेडर को अपने नाम के नामस्थान में संलग्न कर सकते हैं और फिर useआपको इस नामस्थान से क्या चाहिए (लेकिन useपूरे नामस्थान नहीं, क्योंकि यह उन नामों का परिचय देगा जिन्हें आप छिपाना चाहते हैं।


1
यह संभवतया नाम-जनन समस्याओं के कारण होगा यदि शीर्ष लेख फ़ाइल किसी लायब्रेरी के लिए घोषणाएँ हैं। संकलन सफल होगा, लेकिन लिंक करने वाले की परिभाषा नहीं मिल पाएगी, क्योंकि वे पहले से ही एक अलग नाम में संकलित किए गए होंगे।
ग्रहण

-1
#include<iostream>
#include<stdio.h>
namespace namespace1 {
    int t = 10;
}
namespace namespace2 {
    int t = 20;
}
int main() {
using namespace namespace1;
    printf("%d" , t);
    printf("%d" , namespace2::t);
}

1
कृपया अपना उत्तर स्पष्ट करें!
Mazz

आप किसी अन्य नाम स्थान चर का उपयोग करने के लिए गुंजाइश रिज़ॉल्यूशन ऑपरेटर का उपयोग कर सकते हैं
नरेंद्र कुमावत

3
प्रश्न को संबोधित नहीं करता है
एमएम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.