2010-04-08 14 views
6

मैं जानना चाहता हूं कि सी ++ नाम लुकअप तंत्र क्या है।नाम लुकअप तंत्र क्या है?

+0

पहला Google परिणाम: http://www.lysium.de/blog/index.php?/archives/3-C++-name-lookup-mechanism.html –

+3

यह एक बड़ा सवाल है। नाम लुकअप सी ++ के अधिक जटिल पहलुओं में से एक है। इसके कुछ हिस्सों (कोएनिग लुकअप) का नाम लोगों के नाम पर भी रखा जाता है, जैसे खोजकर्ताओं के बाद नए क्षेत्रों का नाम कैसे इस्तेमाल किया जाता था। –

+3

लिटिल ज्ञात फैक्टोइड - एंड्रयू कोएनिग एकमात्र व्यक्ति है जिसका नाम सी ++ मानक - अनुभाग 3.4.2/ –

उत्तर

0

इसके मूल में, यह प्रक्रिया है कि संकलक यह पता लगाने के लिए उपयोग करता है कि दिया गया नाम क्या है - यह एक चर या एक समारोह या कुछ अन्य भाषा निर्माण हो। इसे अंतर्निहित भाषा निर्माण करना है जिसे नाम संदर्भित करता है।

उदा। जब आप फंक्शन printf() पर कॉल करते हैं, तो कंपाइलर को printf के लिए घोषणा मिलनी है ताकि यह समझ सके कि यह क्या है और इसे ठीक से संकलित कर सकता है।

जैसा कि पहले बताया गया था, सी ++ का उपयोग करने वाले विभिन्न नाम लुकअप तंत्र हैं, और आप Google पर आसानी से उन पर जानकारी पा सकते हैं। विकिपीडिया में इसके बारे में कुछ बुनियादी जानकारी भी है: http://en.wikipedia.org/wiki/Name_resolution

12

नाम लुकअप एक नाम का अर्थ पहचानने की प्रक्रिया है। नाम देखने दो उद्देश्यों के लिए अपने कोड

  • निर्धारण का ठीक क्या अपने कोड का मतलब है
  • उदाहरण के लिए यदि आप इस कोड है

    • को स्पष्ट पार्स

      T(a); 
      

      यह है कि क्या T पर निर्भर करता है है एक प्रकार है या नहीं: यदि यह एक प्रकार है, तो यह a की घोषणा होगी, और यदि यह एक प्रकार नहीं है, तो इसे फ़ंक्शन सी के रूप में व्याख्या किया जाता है। सब।

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

      नाम लुकअप उस नाम के घोषणा (3.1) के साथ किसी नाम के उपयोग को जोड़ता है।

      नाम-देखने की दो प्रमुख वर्गों

      • अयोग्य नाम देखने के होते हैं: वर्तमान क्षेत्र से शुरू, एक नाम देखा है, enclosing स्कोप और आधार वर्गों में से बचने के एक वर्ग के अंदर है। एक विशिष्ट नामित दायरे से शुरू नहीं होता है। जैसे ही यह नाम पाता है, यह लुकअप फॉर्म बंद हो जाता है। तो एक आंतरिक दायरे (या कक्षा) में एक नाम एक बाहरी दायरे (या बेस क्लास) में पाया गया नाम छुपाता है।
      • योग्य नाम लुकअप: :: ऑपरेटर का उपयोग करके किसी दिए गए दायरे में नाम दिखाना।

      कई अन्य रूपों मौजूद हैं, एक ऐसा नाम है जो डॉट या तीर बाद दिखाई देता है (जैसे ptr->foo) को देख या class foo में एक नाम (जिसमें nontype नाम अनदेखी कर रहे हैं) को देख की तरह। एक विशेष रोचक रूप argument dependent lookup फ़ंक्शन कॉल में उपयोग किए गए तर्क प्रकारों के आधार पर फ़ंक्शन घोषणाओं को खोजने के लिए उपयोग किया जाता है।

      नाम लुकअप के बाद एक घोषणा मिली, यह देखने का निरीक्षण किया गया कि यह कौन सा गुण प्राप्त हुआ और क्या प्रोग्राम इसका उपयोग कर सकता है।

      केवल नाम लुकअप, समारोह अधिभार संकल्प (यदि लागू हो) और उपयोग की जाँच के बाद सफल रहा है कर रहे हैं गुण नाम की घोषणा के द्वारा शुरू की अभिव्यक्ति प्रसंस्करण में आगे इस्तेमाल किया

      इस प्रकार नाम-देखने निजी वर्ग मिलेगा सदस्यों, लेकिन यदि आप ऐसे नामों का उपयोग करते हैं तो आपके कोड को अस्वीकार कर दिया गया है यदि आपने उन तक पहुंच नहीं है। यह सच है भले ही बेस क्लास का सार्वजनिक उपयोग के साथ एक ही नाम होगा - ऐसा इसलिए है क्योंकि नाम-लुकअप व्युत्पन्न कक्षा में बंद हो जाता है यदि उसे कोई नाम मिलता है।

    +0

    अयोग्य और योग्यता के साथ दिलचस्प अंक देर से विशेषता निरीक्षण (जहां वेक्सिंग "ओवरलोडेड विधि सही आधार को छिपाने वाली विधि" कूदता है।) एक दिलचस्प वीडियो स्टाइल द्वारा, नाम लुकअप के बारे में: https://channel9.msdn.com/Series/C9- व्याख्यान- स्टीफन- टी-लाववेज- कोर- सी-/स्टीफन- टी- लववेज- कोर- सी -1-of-n –

    1

    मुझे नहीं पता कि आप किस नाम का नाम जानने के लिए एक समानता के लिए पूछते हैं या नहीं। लेकिन मैं उपर्युक्त प्रश्न का एक संभावित उत्तर दूंगा। नाम लुकअप तंत्र में गहराई से देखने से पहले, चलो मस्ती और उपयोग के लिए दो अवधारणाओं का मानचित्रण करते हैं।

    1. गुंजाइश ->निर्देशिका
    2. वस्तु ->फ़ाइल

    मैं इस सादृश्य के लिए कारण की व्याख्या करने के लिए नहीं करना चाहती। सोच के निम्नलिखित शाब्दिक रास्ते में, निर्देशिका हर बार गुंजाइश का सामना करना पड़ा है द्वारा गुंजाइश बदलें। तो ऑब्जेक्टफ़ाइल है।

    #include <iostream> 
    
    using namespace std; 
    
    namespace Newton{ 
        double distance, time; 
        double velocity(const double &, const double &); 
    } 
    namespace Einstein{ 
        double distance, time; 
        double velocity(const double &, const double &); 
    } 
    
    int main() 
    { 
        using namespace Newton; 
        double s(10), t(10); 
        velocity(s,t); 
        return 0; 
    } 
    
    double Newton::velocity(const double & s, const double & t){ 
        distance = s; 
        time = t; 
        cout << "Calculation by Newton" << endl; 
        return distance/time; 
    } 
    
    double Einstein::velocity(const double & s, const double & t){ 
        distance = s; 
        time = t; 
        cout << "Calculation by Einstein" << endl; 
        return distance/time; 
    } 
    

    इस कोड में, velocity के कार्यान्वयन क्या है? main() के सहयोग में हम velocity funciton से मिलते हैं। यदि आप इसे फ़ाइल एक्सप्लोरर में पथ नाम की तरह नाम देते हैं, तो velocity वास्तव में /Main/velocity है। बेशक, यदि आप /Main/ के तहत ऑब्जेक्ट नामों की जांच करते हैं, तो अभी भी दो डबल ऑब्जेक्ट्स, s और t और एक नेमस्पेस ऑब्जेक्ट, Newton हैं। यदि आप /Main/double/ के तहत ऑब्जेक्ट्स के नाम सूचीबद्ध करते हैं, तो मुझे लगता है कि अंतर्निहित फ़ंक्शन velocity नामक किसी ऑब्जेक्ट से मेल नहीं खाता है, जिसका अर्थ है, उदाहरण के लिए, ऐसी कोई ऑब्जेक्ट नहीं है - /Built-in Types/double/velocity। यदि आप /Main/Newton/ के तहत ऑब्जेक्ट्स के नामों को फिर से सूचीबद्ध करते हैं, तो वास्तविक निर्देशिका खोज /Newton/ है क्योंकि इसे वहां घोषित किया गया है। फिर, /Newton/ के तहत ऑब्जेक्ट नामों को सूचीबद्ध करें, हमें दो डबल ऑब्जेक्ट्स, distance और time, और एक फ़ंक्शन velocity मिलता है। हां, हम /Main/velocity के लिए उम्मीदवार फ़ंक्शन पाते हैं।

    मैं केवल सी ++ में नाम लुकअप का एक समानता दे सकता हूं। एक तंत्र को समाप्त करने के लिए जोड़ने के लिए और भी कुछ है।

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