2009-02-10 26 views
7

में फ़ाइल वैरिएबल C++ में वैश्विक चर और फ़ाइल चर के बीच क्या अंतर है?वैश्विक चर VS C++

धन्यवाद!

+0

बहाना, मेरी अज्ञानता लेकिन मैं आ मुख्य रूप से सी/उद्देश्य सी पृष्ठभूमि से आते हैं और मैं एक फ़ाइल चर कभी नहीं सुना है ... Do आपका मतलब वैश्विक वैरिएबल है जो केवल उस फ़ाइल में दिखाई देता है जिसे परिभाषित किया गया है? – hhafez

+0

स्पष्ट करें: मुझे लगता है कि आपका मतलब है कि कीवर्ड "स्थिर" का उपयोग किया गया है या नहीं? (स्थिर वैश्विक वर्र्स केवल उस फ़ाइल में दिखाई दे रहे हैं) –

उत्तर

0

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

12

सी और सी ++ में आप वैश्विक चर केवल उस फ़ाइल से पहुंच सकते हैं जिसमें घोषणा के सामने स्थिर कीवर्ड का उपयोग करके घोषित किया जाता है। ग्लोबल जो स्थिर कीवर्ड का उपयोग नहीं करते हैं वे प्रोग्राम में संकलित किसी भी सी या सी ++ फ़ाइल से पहुंच योग्य होते हैं।

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

+0

क्या उपयोगकर्ता परिभाषित कक्षाओं के लिए भी मान्य है? मैंने फ़ाइल 1 में एक ऑब्जेक्ट घोषित कर दिया है और मैं इसे दोनों फाइलों (फ़ाइल 1, फ़ाइल 2), में एक्सेस करना चाहता हूं, मैंने फ़ाइल 1 में '# शामिल फ़ाइल 2.h' और' कक्षा क्लासनाम 'रखा है, फ़ाइल 2 में यह पहचानता है कि यह पहचानता है कक्षा .. लेकिन फिर भी यह मुझे एक त्रुटि देता है !! – Katia

6

सी ++ प्रोग्राम एक समय में एक अनुवाद इकाई संकलित किए जाते हैं (मूल रूप से इसका मतलब है कि प्रत्येक .cpp फ़ाइल स्वतंत्र रूप से संकलित की जाती है)।

डिफ़ॉल्ट रूप से, चर नहीं const हैं उन कार्यों को करता inline और typedef रों नहीं हैं आंतरिक संबंध है: इसका मतलब है कि वे अन्य अनुवाद इकाइयों को दिखाई नहीं देते। यदि अन्य अनुवाद इकाइयां आंतरिक संबंध वाले प्रतीक को संदर्भित करती हैं ( घोषित करने के बाद, जिसके लिए चर के लिए कीवर्ड extern आवश्यक है), लिंकर उन्हें ढूंढने में सक्षम नहीं होगा।

स्पष्ट रूप से आंतरिक लिंकेज की आवश्यकता के लिए कीवर्ड static का उपयोग करें या बेहतर, अनाम नामों का उपयोग करें।

3

नोट: ये नियम कक्षा/संरचना/नामस्थान स्कोपिंग के साथ कुछ लेन-देन के साथ सी ++ के साथ ही सी पर लागू होते हैं। (मैंने यह नहीं देखा कि प्रश्न सी ++ के बारे में था, सी नहीं।

याद रखें कि (ज्यादातर मामलों में) सी स्रोत फ़ाइलों को ऑब्जेक्ट फ़ाइलों में संकलित किया जाता है। ऑब्जेक्ट फ़ाइलों में एक 'निर्यात' तालिका होती है जो लिंकर को बताती है (जब लिंकिंग) यह कौन सा प्रतीक प्रदान करता है। एक प्रतीक एक नाम है (इसका सटीक नाम एबीआई पर निर्भर करता है) एक समारोह या चर (ज्यादातर मामलों में) का जिक्र करता है।

आप अपनी सी स्रोत फ़ाइल में एक वैश्विक चर घोषित करते हैं, तो इस तरह:

// fileA.c 
int hello = 42; 

void printMessage() { 
    printf("Hello, %d world(s)!\n", hello); 
} 

hello और printMessage निर्यात किया जाता है। जब कोई सी ऑब्जेक्ट फ़ाइल 'hello' (एक साधारण एबीआई मानते हुए) नामक प्रतीक का अनुरोध करती है, तो लिंकर fileA.c द्वारा निर्यात किए गए लिंक को जोड़ता है।

अब अन्य मामले के लिए। जब आप इस तरह एक फ़ाइल स्थानीय चर घोषित:

// fileB.c 
static int world = 9001; 

static void messagePrint() { 
    printf("It's over %d!\n", world); 
} 

world और messagePrintनहीं निर्यात कर रहे हैं। जब कोई सी ऑब्जेक्ट फ़ाइल 'hello' नामक प्रतीक का अनुरोध करती है, तो लिंकर hello के साथ कनेक्ट नहीं कर सकता क्योंकि fileB.obj (या जो कुछ भी) में इसके बारे में कोई जानकारी नहीं है।

messagePrint कैसे world के बारे में पता कर सकते हैं? दोनों एक ही अनुवाद इकाई में हैं। दायरा यहां ले जाता है। मुझे यकीन है कि आपको scope through Google पर बहुत सारी जानकारी मिल जाएगी।

(क्या प्रतीक का नाम सी में फ़ंक्शन/परिवर्तनीय नाम मानक से मेल खाता है? मुझे पता है कि यह सी ++ (जहां नाम मैंगलिंग के लिए कोई मानकीकरण नहीं है) के लिए अलग है, इसलिए मैं पहली जगह एबीआई का उल्लेख करता हूं।)

((एबीआई तो सही शब्द, यहां तक ​​कि;? पी))

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