2010-02-16 12 views
48

यदि मेरे पास नीचे की सी फ़ाइल है, तो i और j के बीच क्या अंतर है?स्टेटिक बनाम वैश्विक

#include <stdio.h> 
#include <stdlib.h> 

static int i; 
int j; 

int main() 
{ 
    //Some implementation 
} 
+1

इस प्रश्न का उत्तर पढ़ें: http://stackoverflow.com/questions/1358400/what-is-external-linkage-and-internal-linkage-in-c – avakar

+0

[स्थिर, ऑटो, वैश्विक और स्थानीय चर के बीच अंतर सी और सी ++ के संदर्भ में] (https://stackoverflow.com/questions/13415321/difference-between-static-auto-global-and-local-variable-in-the-context-of-ca) –

उत्तर

44

i में आंतरिक संबंध है ताकि आप उसी स्रोत को संदर्भित करने के लिए अन्य स्रोत फ़ाइलों (सख्ती से अनुवाद इकाइयों) में i नाम का उपयोग नहीं कर सकें।

j में बाहरी संबंध है ताकि आप इस ऑब्जेक्ट को संदर्भित करने के लिए j का उपयोग कर सकें यदि आप इसे अन्य अनुवाद इकाई में extern घोषित करते हैं।

+7

क्या कोई प्रदर्शन अंतर है? – ma11hew28

+0

यदि आप एक ही काम कर रहे हैं, तो एक रनटाइम अंतर नहीं होना चाहिए, क्योंकि संकलक एक ही कोड उत्पन्न कर सकता है। यद्यपि संकलन वैश्विक के साथ थोड़ा लंबा हो सकता है, क्योंकि इसमें व्यापक क्षेत्र है। –

17

i मॉड्यूल के बाहर दिखाई नहीं दे रहा है; j वैश्विक रूप से सुलभ है।

है यही कारण है, एक और मॉड्यूल है, जो इसे से जुड़ा हुआ है,

extern int j; 

और फिर पढ़ सकते हैं और j में मूल्य लिखने में सक्षम हो सकते हैं। वही अन्य मॉड्यूल i तक नहीं पहुंच सकता है, लेकिन इसका अपना उदाहरण घोषित कर सकता है, यहां तक ​​कि एक वैश्विक भी - जो पहले मॉड्यूल के लिए दृश्यमान नहीं है।

+1

क्या है 'बाहरी' घोषणा आवश्यक है? –

+1

यह कार्यान्वयन पर निर्भर करता है। 'बाहरी' का उपयोग परेशानी का कारण नहीं होने के लिए गारंटी दी जाती है, बशर्ते एक मॉड्यूल में गैर-'मानक' और सार्वजनिक (जो इसे आवंटित करता है) के रूप में प्रतीक हो। शुरुआती यूनिक्स कार्यान्वयन एक ही नाम के साथ मर्ज किए गए प्रतीकों - फोर्ट्रान आम की तरह- 'बाहरी' की आवश्यकता नहीं थी। – wallyk

+1

ध्यान दें कि "दिखाई नहीं दे रहा" इसका मतलब दायरे से बाहर नहीं है। इसका मतलब यह है कि यदि आप एक अलग संकलन इकाई में मुझे घोषित करेंगे और आप अपनी .c फ़ाइल से स्थिर I को हटा देंगे, तो मैं आपकी .c फ़ाइल पर दिखाई देगी। इसके विपरीत, यदि वैश्विक मैं दायरे से बाहर था तो इससे कोई फर्क नहीं पड़ता कि आपके पास आपकी .c फ़ाइल में एक स्थिर I घोषित किया गया है। वैश्विक एक कभी दिखाई नहीं देगा। स्थाई मैं एक वैश्विक संकलन इकाई में परिभाषित वैश्विक पर प्राथमिकता ले रहा हूं जिसे 'छायांकन' कहा जाता है। यह फ़ंक्शन स्थानीय लोगों के साथ भी होता है और सी ++/सी-केवल चीज़ नहीं है। – Jupiter

4

अंतर यह है कि i में आंतरिक संबंध है, और j में बाहरी जुड़ाव है। इसका अर्थ यह है कि आप जिन फ़ाइलों से लिंक करते हैं, उनके j तक पहुंच सकते हैं, जबकि i केवल उस फ़ाइल में उपलब्ध है जहां इसे घोषित किया गया है।

3

iस्थिर लिंक होगा, यानी, चर केवल वर्तमान फ़ाइल में पहुंच योग्य है।

jextern के रूप में परिभाषित किया जाना चाहिए, कि

extern int j; 
एक और हेडर फाइल ( .h) में

है, और फिर इसे बाहरी लिंकेज होगा, और फ़ाइलों में पहुँचा जा सकता है।

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