2011-01-25 13 views
8

संभव डुप्लिकेट:
Difference between 'global' and 'static global'स्थिर int int और int के बीच क्या अंतर है?

क्या बयान 1 और 2 के बीच अंतर है: - मदद के लिए

#include <stdio.h> 
//In the global declaration area 

static int a; // 1. 
int b;  // 2. 

धन्यवाद।

+0

कई डुप्लिकेट, उदा। ['वैश्विक' और 'स्थैतिक वैश्विक' के बीच अंतर] (http://stackoverflow.com/questions/959889/difference-between-global-and-static-global) –

+0

दिए गए सभी उत्तरों के अलावा, यह उल्लेखनीय है कि सभी स्थैतिक चर, कोई फर्क नहीं पड़ता कि उन्हें आवंटित किया गया है, साथ ही साथ सभी वैश्विक चर (जैसे "बी" ऊपर), "स्थिर प्रारंभिक" के अधीन हैं। इसका मतलब है कि इसे शुरू होने से पहले प्रोग्राम द्वारा प्रारंभ किया जाना चाहिए। इस प्रकार, आपको मानक द्वारा गारंटी दी जाती है कि वे शुरू किए गए हैं। यदि आपने उन्हें स्पष्ट रूप से प्रारंभ नहीं किया है, तो वे निश्चित रूप से शून्य (या पॉइंटर्स के लिए न्यूल) में प्रारंभ किए गए हैं। यह उन्हें स्थानीय स्कोप चर से भी अलग बनाता है। – Lundin

उत्तर

5

एक static वैश्विक चर, स्थानीय translation unit करने के लिए इसे में परिभाषित किया जाता है तो अगर आप दो अलग अलग अनुवाद इकाइयों में static int a; परिभाषित करते हैं, यह दो स्वतंत्र चर पैदा करेगा।। यदि आप दो अनुवाद इकाइयों में एक गैर स्थैतिक वैश्विक चर int b; परिभाषित करते हैं, तो आपको एक लिंकर त्रुटि का अनुभव होगा (लेकिन आप दो अनुवाद इकाइयों में से एक में extern int b; का उपयोग कर सकते हैं ताकि लिंकर को यह बताने के लिए कि इसे अन्य चर इकाई से वैश्विक चर का उपयोग करना चाहिए)।

+1

ग्रेट स्पष्टीकरण ..... धन्यवाद – Muse

6

दोनों, चर परिभाषाएं दी गई हैं लेकिन, static कीवर्ड "वैश्विक घोषणा क्षेत्र" में एक चर के लिए आवेदन किया प्रतिबंधित करती है कि वैश्विक चर केवल अनुवाद इकाई जिसमें यह परिभाषित किया गया है में देखा जाना चाहिए।

+7

दूसरे शब्दों में, यदि यह फ़ाइल 'foo.c'' में है, तो 'bar.c' इसे एक्सेस नहीं कर पाएगा, भले ही आप इसे' बाहर कर दें '। – EboMike

+0

@EboMike +1, आगे स्पष्टीकरण के लिए धन्यवाद – SiegeX

2

static int a केवल उस फ़ाइल के भीतर पहुंच योग्य है। int b को एक अलग फ़ाइल से extern int b के साथ एक्सेस किया जा सकता है।

+0

पैडेंटिक होने के लिए, यदि आप हेडर फ़ाइल में 'स्थिर int a' को परिभाषित करते हैं, तो यह उस फ़ाइल के भीतर "पहुंच योग्य नहीं होगा"; –

3

वे कार्यक्रम के पूरे जीवनकाल के लिए याद में हैं। वैरिएबल जिसे स्थिर घोषित किया गया है केवल उस फ़ाइल में गुंजाइश है जिसमें इसे घोषित किया गया है, जहां बाहरी घोषित किए गए चर के बिना घोषित वैरिएबल को अन्य फ़ाइलों से एक्सेस किया जा सकता है।

मूल स्रोत - http://bytes.com/topic/c/answers/860211-global-variable-static-global-variable

+1

यह उत्तर सबसे पूरा है प्रदान की है। – Lundin

1

एक स्थैतिक चर का जीवन कार्यक्रम के पूरे जीवनकाल में फैला हुआ है। हालांकि, दायरे के नियम अभी भी लागू होते हैं।

यदि आप किसी विधि के बाहर अपने स्थिर चर को परिभाषित करते हैं (आमतौर पर कक्षा की शुरुआत में) तो आपका चर उस कक्षा के भीतर कहीं से भी उपलब्ध होगा।

आप इन वस्तुओं के मूल्य को नहीं बदल सकते हैं। वे आम तौर पर एपीआई कुंजी जैसी चीजों को संग्रहित करने के लिए उपयोग किए जाते हैं।

1
static int a; 
int b; 

a में आंतरिक संबंध है। b में बाहरी संबंध है।

C99 6.2.2

6.2.2 पहचान फाई ईआरएस के सम्पर्क

  • 1) एक पहचान फाई एर अलग-अलग दायरों में घोषित या एक ही दायरे में एक बार से अधिक ही उल्लेख करने के लिए बनाया जा सकता है लिंकेज नामक प्रक्रिया द्वारा ऑब्जेक्ट या फ़ंक्शन। तीन प्रकार के संबंध हैं: बाहरी, आंतरिक, और कोई भी नहीं।

  • 2) अनुवाद इकाइयों और पुस्तकालयों के सेट है कि एक पूरे कार्यक्रम का गठन किया, बाहरी लिंकेज के साथ एक विशेष पहचान फाई एर से प्रत्येक घोषणा एक ही वस्तु या समारोह को दर्शाता है। एक अनुवाद इकाई के भीतर, आंतरिक लिंकेज के साथ पहचान की प्रत्येक घोषणा एक ही ऑब्जेक्ट या फ़ंक्शन को दर्शाती है। लिंकेज के साथ पहचान की प्रत्येक घोषणा एक अद्वितीय इकाई को दर्शाती है।

  • 3) एक वस्तु या एक समारोह के लिए एक इंटरनेट le गुंजाइश पहचान फाई एर की घोषणा भंडारण वर्ग विशिष्ट एर स्थिर होते हैं, तो पहचान फाई एर आंतरिक संबंध है।

+0

आप मान रहे हैं कि वे दोनों फाइल स्कोप पर आवंटित हैं। अगर उन्हें स्थानीय रूप से आवंटित किया गया था, तो आपका कथन सत्य नहीं होगा। स्थैतिक में अभी भी आंतरिक संबंध होगा, लेकिन गैर स्थैतिक "स्वचालित" लिंकेज के साथ आवंटित किया जाएगा, यानी स्टैक पर या एक सीपीयू रजिस्टर में। – Lundin

+0

@ लंदन: "आप मानते हैं कि वे दोनों फाइल स्कोप पर आवंटित हैं" फिर से प्रश्न देखें। –

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