2011-10-20 16 views
37

संभव डुप्लिकेट वैश्विक:
Static vs globalC/C++ बनाम स्थिर वैश्विक

मैं वैश्विक और स्थिर वैश्विक चर के बीच मतभेदों के बारे में संदेह में हूँ। स्थिर मतलब यह है कि इस चर केवल एक ही फाइल के लिए वैश्विक है, तो दो अलग अलग फ़ाइलों में एक ही नाम में क्यों एक नाम टकराव का कारण?

कोई इस व्याख्या कर सकते हैं?

+4

पोस्ट कोड ... – Nawaz

+0

आपको एक उदाहरण है? – glglgl

+2

दोनों चर अलग फ़ाइलों में स्थिर घोषित कर रहे हैं, यह एक नाम टक्कर का कारण नहीं होना चाहिए।मैंने अभी एक त्वरित परीक्षण किया है और यह उम्मीद के अनुसार काम करता है। यदि यह आपके लिए काम नहीं करता है, तो कृपया उस कोड को पोस्ट करें जहां आप उम्मीद करते हैं कि यह काम नहीं करता है, आप क्या उम्मीद करते हैं और आपको क्या मिलता है, और आप किस कंपाइलर का उपयोग कर रहे हैं। – Kevin

उत्तर

65

वैश्विक चर (static नहीं) जब आप .o फ़ाइल को अन्य फ़ाइलों में उपयोग के लिए लिंकर पर उपलब्ध कराते हैं तो वहां होते हैं। इसलिए, अगर आप इस तरह दो फ़ाइलों है, तो आप नाम टक्कर a पर मिलता है:

एसी:

#include <stdio.h> 

int a; 

int compute(void); 

int main() 
{ 
    a = 1; 
    printf("%d %d\n", a, compute()); 
    return 0; 
} 

BC:

int a; 

int compute(void) 
{ 
    a = 0; 
    return a; 
} 

क्योंकि लिंकर पता नहीं है वैश्विक का जो a रों उपयोग करने के लिए।

हालांकि, जब आप स्थैतिक ग्लोबल्स को परिभाषित करते हैं, तो आप संकलक को केवल उस फ़ाइल के लिए चर रखने के लिए कह रहे हैं और लिंकर को इसके बारे में जानकारी न दें। तो अगर आप दो नमूना कोड मैंने लिखा करने के लिए (a की परिभाषा में) static जोड़ने के लिए, आप नाम टकराव नहीं मिलेगा क्योंकि लिंकर भी पता नहीं है वहाँ फ़ाइलों में से किसी में एक a:

एसी:

#include <stdio.h> 

static int a; 

int compute(void); 

int main() 
{ 
    a = 1; 
    printf("%d %d\n", a, compute()); 
    return 0; 
} 

BC:

static int a; 

int compute(void) 
{ 
    a = 0; 
    return a; 
} 

कि प्रत्येक फ़ाइल अन्य लोगों के बारे में जानने के बिना अपने स्वयं के a साथ काम करता है इसका मतलब यह है।


एक तरफ ध्यान दें के रूप में, यह उन्हें static में से एक और अन्य नहीं जब तक कि वे अलग अलग फ़ाइलों में हैं के लिए ठीक है। यदि दो घोषणाएं एक ही फ़ाइल में हैं (अनुवाद इकाई पढ़ें), एक static और एक extern, this answer देखें।

+0

एक स्थिर और दूसरे को घोषित करने के बारे में क्या नहीं? – Kissaki

+1

@ किसाकी, अगर ये घोषणाएं अलग-अलग फाइलों में हैं, तो यह ठीक है। जिस फ़ाइल में स्थैतिक घोषणा है वह उस स्थिर चर का उपयोग करेगा जो अन्य फ़ाइलों के लिए अदृश्य है। गैर-स्थैतिक परिवर्तनीय घोषणा वाली सभी फ़ाइलें साझा वैश्विक चर का उपयोग करेंगी। – Shahbaz

+0

यदि उन दो घोषणाओं, एक स्थिर और एक बाहरी, एक ही फ़ाइल में लिखे गए हैं (अनुवाद इकाई पढ़ें), [यह उत्तर] देखें (http://stackoverflow.com/a/17043698/912144)। – Shahbaz

6

प्रत्येक फ़ाइल में स्थैतिक नाम नाम टकराव का कारण नहीं होना चाहिए। आपको लगता है कि देख रहे हैं तो पोस्ट करें (छोटी) डेमो कोड यह दिखा रहा है, सटीक संकलक के साथ-साथ आप तो हम ठीक से कोड सत्यापित कर सकते हैं का उपयोग कर रहे हैं और यह सही है यह सोचते हैं, उचित संकलक गालियां देना।

बस Fwiw, सी ++ में पसंदीदा तरीका बजाय एक गुमनाम नाम स्थान का उपयोग करने के लिए है:

namespace { 
    int not_a_static_variable; 
} 

सब ईमानदारी में, कोई मुझे यह है कि करने के लिए उद्देश्य लाभ का एक बहुत कुछ को इंगित नहीं कर सकते हैं ...

+1

'सभी ईमानदारी में, नहीं, मैं उस पर बहुत से उद्देश्य का लाभ नहीं दे सकता ...' ... शायद यह विषय किसी भी तरह से मदद कर सकता है: [नामित नामस्थान स्थिर के लिए "श्रेष्ठ" विकल्प क्यों है?] (http://stackoverflow.com/questions/4977252/why-unnamed-namespace-is-a-superior-alternative-to -स्टैटिक) – Nawaz

+5

सी ++ 11 स्थैतिक वस्तुओं के बहिष्कार को हटा देता है, इसलिए इन दिनों न तो विधि विशेष रूप से "पसंदीदा" होती है। –

+0

@ माइकसेमोर: यह भी सच है। – Nawaz

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