2008-10-03 19 views
64

मेरे विकास प्रणाली (CodeGear सी ++ बिल्डर) की अनियमितता की है कि स्वत: जनरेट हेडर से कुछ होने पर जोर देते है ...मैं नामस्थान को "अप्रयुक्त" कैसे कर सकता हूं?

using namespace xyzzy 

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

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

शायद ...

unusing namespace xyzzy; 
+2

आप शायद उनके QC प्रणाली के साथ एक बग रिपोर्ट खोलना चाहिए: XE संस्करण के बाद से एक नया मान है कि आप खतरनाक using namespace System; पूर्णांक को शामिल से बचने के लिए #define कर सकते है: http://qc.codegear.com/ –

+1

बीटीडब्ल्यू, कौन से ऑटो-जेनरेट किए गए हेडर ये हैं? –

+0

एक दिन सी ++ में मॉड्यूल होंगे, और अन्य कोड में कोड सहित बेहतर encapsulation संरचनाएं होगी। तब तक, इसके चारों ओर एक आसान तरीका नहीं है। अपने कोड को नामस्थान में डालने पर विचार करें और इस तरह से इसका जिक्र करें। –

उत्तर

45

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

संलग्न अगर
namespace codegear { 
    #include "codegear_header.h" 
} // namespace codegear 

... फिर उस शीर्षलेख के भीतर किसी भी निर्देश का उपयोग तटस्थ हो जाता है।

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

+0

सामान्य रूप से, यह एक _terrible_ विचार है। सी ++ हेडर का उपयोग वैकल्पिक रूप से नामस्थान में शामिल करने का इरादा नहीं है जैसा कि यहां उपयोग किया गया था। – Aaron

+17

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

+3

हेडर को अपने नामस्थान में रखना कोई समाधान नहीं है क्योंकि यह उस लाइब्रेरी में घोषणाओं के अर्थ को बदलता है। (-1) –

37

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

उदाहरण:

{ 
    using namespace xyzzy; 

} // stop using namespace xyzzy here 

शायद तुम जो अपने स्वत: जनरेट हेडर की प्रयोग किया जाता है टेम्पलेट बदल सकते हैं।

+0

क्या आप इस तरह के ब्लॉक में शामिल कर सकते हैं? – Eclipse

+0

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

+0

हाँ यह वास्तव में नामस्थानों का उपयोग कर शीर्षकों की समस्या का समाधान नहीं करता है। – Kip

1

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

+1

यदि हेडर फाइल लाइब्रेरी के लिए घोषणाएं हैं तो यह नाम-उलझन के मुद्दों का कारण बन जाएगा। संकलन सफल होगा, लेकिन लिंकर परिभाषाओं को नहीं ढूंढ पाएगा, क्योंकि वे पहले से ही एक अलग नामस्थान में संकलित किए गए होंगे। – Eclipse

12

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

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 
7

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

+0

यदि कई शीर्षलेख हैं, तो यह बहुत धीमा हो सकता है – doc

+3

sed कोड कोड जनरेटर धीमा? विश्वास करना मुश्किल है ... – Arkadiy

8

भविष्य में संदर्भ के लिए: DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE

+3

अच्छा, धन्यवाद। शायद मुझे एसए रद्द नहीं किया जाना चाहिए ... – Roddy

+0

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

-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); 
} 
+0

कृपया अपना उत्तर दें! – Mazz

+0

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

+1

प्रश्न का समाधान नहीं करता –

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

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