2010-05-06 6 views
8

सी static में या तो स्थानीय परिवर्तनीय या बाहरी लिंक के बिना एक वैश्विक चर/चर का मतलब हो सकता है। सी ++ में इसका मतलब प्रति-वर्ग सदस्य चर या सदस्य फ़ंक्शन भी हो सकता है।यह कैसे हुआ कि "स्थैतिक" सी और सी ++ में बाहरी संबंध के बिना फ़ंक्शन/चर को इंगित करता है?

क्या यह कोई संदर्भ है कि static कीवर्ड जो बाहरी लिंकेज की कमी के लिए पूरी तरह से अप्रासंगिक लगता है, बाहरी संपर्क की कमी को दर्शाने के लिए उपयोग किया जाता है?

उत्तर

4

static एक स्टोरेज विनिर्देशक है। "स्थैतिक" शब्द का अर्थ अपरिवर्तनीय है। "संग्रहण" का अर्थ है कि वस्तु स्मृति में कहां है, यानी इसका पता।

static संग्रहण वाला एक ऑब्जेक्ट निरंतर पते पर रहता है।

ऐसा इसलिए होता है कि extern स्टोरेज के साथ एक ऑब्जेक्ट का निरंतर पता भी है। सी और सी ++ कार्यक्रमों के लिंक के कारण, यह एक आवश्यकता है। और क्योंकि extern कम से कम आश्चर्यजनक व्यवहार होता है, यह भी डिफ़ॉल्ट है।

यदि आप extern के संदर्भ में static के शीर्ष पर एक अतिरिक्त सुविधा होने के बारे में सोचते हैं, तो मुझे लगता है कि यह थोड़ा और समझ में आता है। static फ़ंक्शन घोषित करने के लिए यह थोड़ा बेवकूफ है, क्योंकि किसी भी पूर्ण-संकलित भाषा में कोई विकल्प नहीं है, लेकिन फ़ंक्शन का पता स्थिर है, भले ही यह बाहरी रूप से दिखाई न दे।

वास्तव में असंगत हिस्सा है, तो, उस वर्ग के सदस्यों को जो विभिन्न संकलन इकाइयों के बीच साझा की जाती हैं static, नहीं extern घोषित किया जाना चाहिए ...

6

पहले से मौजूद मौजूदा कीवर्ड का उपयोग करने से भाषा में एक नया कीवर्ड जोड़ने का लाभ नहीं है, जो मौजूदा कार्यक्रमों को तोड़ सकता है। यह भ्रमित हो सकता है लेकिन इसे एक "कम बुराई" माना जाता है।

+3

और स्थिर, सी ++ कीवर्ड की तरह, एक संदर्भ-निर्भर अर्थ है। – Klaim

6

मुझे लगता है कि आप उन स्थिरताओं को परिभाषित करने के लिए स्थैतिक उपयोग पर विचार करते हैं जो फ़ंक्शन कॉल के बीच अपना मूल्य बरकरार रखते हैं।

निम्नलिखित पर विचार करें:

void func() { 
    static int x; 
} 

बनाम

int x; 
void func() { 
} 

func की दृष्टि से, x या तो मामले में एक ही व्यवहार करती है। मूल्य निरंतर कॉल के बीच रहता है। दोनों के बीच का अंतर यह है कि x कौन देख सकता है। पहले में, कोई भी नहीं कर सकता। दूसरे में, सब लोग कर सकते हैं।

यह अवधारणा वैश्विक दायरे में स्थिर चर तक फैली हुई है। यदि आप सिर्फ एक चर घोषित करते हैं, तो हर कोई इसे देख सकता है। लेकिन यदि आप उस चर स्थिर को घोषित करते हैं, तो केवल वह फ़ाइल ही इसे देख सकती है। जाहिर है, आपको इस तथ्य की अनुमति देनी है कि दृश्यता को सीमित करने के लिए कोई अतिरिक्त दायरा नहीं है, लेकिन विचार वहां है।

स्थिर सदस्यों से संबंधित सी ++ में अतिरिक्त अर्थ मूल उदाहरण के लिए भी समान है। वर्ग के सभी उदाहरणों द्वारा साझा किया गया एक एकल चर।

+0

मैं यहां अपने शब्द से प्रसन्न नहीं हूं: -/असल में, जो मैं पूरा करने की कोशिश कर रहा हूं वह यह है कि सभी तीन प्रयोगों का अनिवार्य रूप से वैश्विक चर में परिणाम होता है जो वर्तमान दायरे तक ही सीमित है। –

+0

यह ** बिल्कुल ** कारण है। मुझे समझ में नहीं आता कि उपरोक्त (पूरी तरह से बेकार) जवाब को और वोट मिले हैं! – Shahbaz

+0

क्लास-वेरिएबल अर्थ थोड़े से "मौजूदा दायरे तक सीमित" भाग में एक रिंच फेंक देता है, हालांकि। 'कक्षा एक्स {सार्वजनिक: स्थैतिक int foo; }; 'वैश्विक रूप से दृश्यमान' एक्स :: foo' घोषित करता है (यद्यपि वह 'X :: 'क्वालीफायर की आवश्यकता है)। – cHao

2

सी संस्करण एक समारोह के बाहर "स्थैतिक रूप से जुड़ा हुआ" का मतलब है।

सी ++ वर्ग संस्करण और सी के अंदर फ़ंक्शन संस्करणों का अर्थ "स्थैतिक रूप से संग्रहीत" है, जिसका अर्थ है कि वे कक्षाओं में auto (स्टैक या स्थानीय) चर या आवृत्ति चर नहीं हैं।

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