2011-02-24 17 views
17

सी ++ में #include निर्देश और using namespace के बीच क्या अंतर है? साथ ही आप अपने नेमस्पेस को अलग फाइलों के रूप में स्टोर करते हैं और ऐसी फाइलों के लिए फ़ाइल एक्सटेंशन क्या है?सी ++: नेमस्पेस और #include

+0

सी में कोई नामस्थान नहीं है, केवल C++ में बदला गया है। –

उत्तर

22

अपने प्रश्न का उत्तर देने के लिए, मैं थोड़ा पीछे जाऊंगा और सी और सी ++ की कुछ मूलभूत बातें ले जाऊंगा।

सी/सी ++ संकलित करते समय, स्रोत फ़ाइलों को वास्तविक निष्पादन योग्य में संकलित करना वास्तव में दो चरणों, संकलन और लिंकिंग है। संकलन चरण एक समय में एक .cpp फ़ाइल लेता है और इसे संकलित करता है। अन्य .cpp फ़ाइलों की सामग्री कंपाइलर के लिए दृश्यमान नहीं हैं। यह एक "ऑब्जेक्ट फ़ाइल" उत्पन्न करता है (मुझे नहीं पता कि इसे ऐसा क्यों कहा जाता है)। अंतिम ऑब्जेक्टिव बनाने के लिए सभी ऑब्जेक्ट फ़ाइलों को लिंकर द्वारा तब जोड़ा जाता है।

यह सी ++, घोषणाओं और परिभाषाओं में दो महत्वपूर्ण अवधारणाओं को लाता है। एक घोषणा निर्दिष्ट करती है कि कुछ (एक चर या एक समारोह) कहीं मौजूद होगा। निम्नलिखित

void Foo(); 

इसका मतलब यह है कि हम संकलक है कि कहीं वहाँ एक समारोह फू() है कि कोई तर्क लेता है हो सकता है और कोई मान प्रदान करेंगे बता दिया है समारोह फू() की घोषणा है।

एक परिभाषा निर्दिष्ट करती है कि वास्तव में कौन सा कार्य करता है। यहाँ समारोह परिभाषित

void Foo() { cout << "Foo!!"; } 

चलो एक और समारोह, बार परिभाषित किया जाता है()

void Bar() { 
    Foo(); 
    cout << "bar"; 
} 

इस समारोह समारोह फू() कहते हैं। फ़ंक्शन foo को पहले से ही उसी फ़ाइल में घोषित या परिभाषित नहीं किया गया है, तो इस फ़ंक्शन को संकलित नहीं किया जा सकता है। तो घोषणा स्वयं किसी संकलित कोड का उत्पादन नहीं करती है।उन्हें बस वहां रहना है।

यदि फ़ंक्शन फ़ू() इस फ़ाइल में परिभाषित नहीं है, लेकिन एक अलग .cpp फ़ाइल है, तो यह इन दो कार्यों के बीच कनेक्शन बनाने के लिए लिंकर का काम है। यदि फ़ंक्शन Foo() को कहीं भी परिभाषित नहीं किया गया है, तो आपको एक लिंकर त्रुटि मिलेगी, न कि संकलक त्रुटि।

यह हेडर फ़ाइलों की अवधारणा पर आता है। शीर्षलेख फ़ाइलें वह जगह होती हैं जहां आप अपनी घोषणाएं संग्रहीत करते हैं। शीर्षलेख फ़ाइल की सामग्री को शामिल करने के लिए # शामिल करने का उपयोग करते समय, वास्तव में क्या होता है यह है कि प्रीप्रोसेसर (वास्तविक संकलक से पहले निष्पादित एक चरण) शामिल फ़ाइल लोड करेगा और सामग्री को मूल स्रोत फ़ाइल में "पेस्ट" करेगा। तो संकलक फ़ाइल को देखेगा जैसे कि संपूर्ण हेडर फ़ाइल वास्तव में C++ फ़ाइल में चिपका दी गई थी।

तो जब आप सी ++ में कार्यक्रम, आप सामान्य रूप से अपने परिभाषाओं सीपीपी फाइलों में जगह होगा, और आप ज फ़ाइलों में अपने घोषणाओं स्थापित करेंगे दूसरी ओर

नेमस्पेस बस एक तरह से करने के लिए तार्किक समूह अपने कोड है ।

तो नहीं, नामस्थान अलग फ़ाइलों में संग्रहीत नहीं हैं, और उनके पास एक विशिष्ट फ़ाइल एक्सटेंशन नहीं है। अगर मेरे पास एकाधिक नामस्थानों वाला प्रोजेक्ट था तो मैं प्रत्येक नेमस्पेस के लिए एक अलग निर्देशिका बना सकता हूं (और फिर, शायद नहीं, यह स्थिति पर निर्भर करेगा)।

34

सी ++ में, #include जबकि namespace तार्किक मॉड्यूल में अपनी वस्तुओं (नाम स्थान सी पर लागू नहीं होता)

उदाहरण के लिए रखने के लिए प्रयोग किया जाता है अपनी परियोजना के लिए फ़ाइलों को जोड़ने के लिए प्रयोग किया जाता है, तो आप फ़ाइल में एक सदिश वर्ग हो सकता है "vector.h" तो आप इसे अपनी परियोजना में शामिल करते हैं।

वेक्टर एक बड़ा पुस्तकालय (मानक पुस्तकालय) एसटीडी का एक हिस्सा है, तो आप

std::vector 

लेकिन जब से प्रोग्रामर आलसी हैं और std :: सब कुछ खत्म हो लिखने के लिए नहीं करना चाहते हैं के साथ उपयोग कर सकते हैं जगह (मानक पुस्तकालय में कई बहुत उपयोगी भाग हैं), आप

using namespace std 

अपनी फ़ाइल के शीर्ष पर लिख सकते हैं। यह संकलक को बताएगा कि हर बार जब यह एक प्रकार (जैसे वेक्टर) देखता है, तो नामस्थान std में भी जांच करें क्योंकि परिभाषा वहां हो सकती है। इस तरह, निम्नलिखित कथन समकक्ष बन जाते हैं।

std::vector 
vector 

vector.h में, आप,

namespace std 
{ 
    class vector { /* Implementation */ } 
} 

तो #include फ़ाइलें जोड़ने के लिए है की तरह कुछ देखना चाहिए using namespace अपने कोड क्लीनर रखने के लिए और "सार्थक" पुस्तकालयों में पैक करने के लिए है, जबकि। प्रोग्रामिंग करते समय आप using namespace को छोड़ सकते हैं लेकिन आपको पूरी तरह से #include

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