एक्सटर्नल वेरिएबल
सी प्रोग्रामिंग भाषा में, बाहरी चर किसी भी फ़ंक्शन ब्लॉक के बाहर परिभाषित चर है। दूसरी ओर, स्थानीय (स्वचालित) चर फ़ंक्शन ब्लॉक के अंदर परिभाषित चर है।
स्वचालित चर के विकल्प के रूप में, उन चरों को परिभाषित करना संभव है जो सभी कार्यों के लिए बाहरी हैं, अर्थात वे चर जिन्हें किसी भी कार्य द्वारा नाम से पहुँचाया जा सकता है। (यह तंत्र फोरट्रान सामान्य या पास्कल वैरिएबल के जैसे है जो सबसे बाहरी ब्लॉक में घोषित किया गया है।) क्योंकि बाहरी चर विश्व स्तर पर सुलभ हैं, डेटा को संप्रेषित करने के लिए तर्क सूचियों के अतिरिक्त उनका उपयोग किया जा सकता है। कार्यों के मध्य इसके अतिरिक्त, क्योंकि बाह्य चर स्थायी रूप से अस्तित्व में रहते हैं, अतिरिक्त प्रकट होने और विलुप्त होने के अतिरिक्त कार्यों को कहा जाता है और बाहर निकल जाते हैं, वे अपने मूल्यों को बनाए रखते हैं, उन्हें निर्धारित करने वाले कार्य वापस आ गए हों।
परिभाषा, घोषणा और extern
कीवर्ड
यह विचार करने के लिए कि बाह्य चर extern
कीवर्ड किस प्रकार संबंधित हैं, चर को परिभाषित करने और घोषित करने के मध्य के अंतर को जानना आवश्यक है। जब चर को परिभाषित किया जाता है, तो संकलक उस चर के लिए स्मृति आवंटित करता है और संभवतया इसकी सामग्री को कुछ मान में प्रारंभ करता है। जब चर घोषित किया जाता है, तो संकलक को चर को कहीं और परिभाषित करने की आवश्यकता होती है। घोषणापत्र संकलक को सूचित करता है कि उस नाम और प्रकार से चर उपस्थित है, किन्तु संकलक को इसके लिए स्मृति आवंटित करने की आवश्यकता नहीं है क्योंकि इसे कहीं और आवंटित किया गया है। extern
कीवर्ड का अर्थ है बिना परिभाषित किए घोषित करना, दूसरे शब्दों में, यह चर को स्पष्ट रूप से घोषित करने की प्रविधि है, या परिभाषा के बिना घोषणा को बाध्य करने की प्रविधि है। चर को स्पष्ट रूप से परिभाषित करना भी संभव है, अर्थात परिभाषा को बाध्य करना है। यह चर को प्रारंभिक मूल्य असाइन करके किया जाता है। यदि न तो extern
कीवर्ड और न ही प्रारंभिक मूल्य उपस्थित हैं, कथन या तो घोषणा या परिभाषा हो सकती है। यह कंपाइलर पर निर्भर करता है कि वह प्रोग्राम के मॉड्यूल्स का विश्लेषण करे और निर्धारित करे।
कार्यक्रम के मॉड्यूल में चर को परिभाषित किया जाना चाहिए। यदि कोई परिभाषा एक से अधिक नहीं है, तो संभवतः लिंकिंग चरण में त्रुटि उत्पन्न होती है। चर को कई बार घोषित किया जा सकता है, जब तक कि घोषणाएं दूसरे के साथ और परिभाषा के अनुरूप हों (कुछ ऐसा है जो शीर्षलेख फ़ाइलें अधिक सुविधा प्रदान करती है)। इसे कई मॉड्यूल में घोषित किया जा सकता है, जिसमें वह मॉड्यूल भी सम्मिलित है जहां इसे परिभाषित किया गया था, और यहां तक कि मॉड्यूल में कई बार, किन्तु सामान्यतः मॉड्यूल में इसे अधिक बार घोषित करना व्यर्थ होता है।
किसी फ़ंक्शन के अंदर बाहरी चर भी घोषित किया जा सकता है। इस स्थिति में extern
कीवर्ड का उपयोग किया जाना चाहिए, अन्यथा संकलक इसे स्थानीय चर की परिभाषा मानेगा, जिसकी भिन्न सीमा, जीवनकाल और प्रारंभिक मूल्य है। यह घोषणा सम्पूर्ण फंक्शन के मॉड्यूल के अतिरिक्त केवल फंक्शन के अंदर ही दिखाई देगी। फ़ंक्शन प्रोटोटाइप पर प्रारम्भ extern
कीवर्ड बिल्कुल कुछ नहीं करता है ( फ़ंक्शन परिभाषा पर प्रारम्भ extern
कीवर्ड निश्चित रूप से गैर-सनसनीखेज है)। फ़ंक्शन प्रोटोटाइप सदैव घोषणा है और परिभाषा कभी नहीं है। साथ ही, मानक सी में, फ़ंक्शन सदैव बाहरी होता है, किन्तु कुछ कंपाइलर एक्सटेंशन फ़ंक्शन को फ़ंक्शन के अंदर परिभाषित करने की अनुमति देते हैं।
बाहरी चर को परिभाषित किया जाना चाहिए, किसी भी फ़ंक्शन के बाहर; यह इसके लिए भंडारण को भिन्न करता है। वेरिएबल को प्रत्येक फ़ंक्शन में भी घोषित किया जाना चाहिए जो इसे एक्सेस करना चाहता है; यह चर के प्रकार को बताता है। घोषणा स्पष्ट हो सकती है।
extern
कथन या संदर्भ से निहित हो सकता है। ...आपको ध्यान देना चाहिए कि जब इस खंड में बाहरी चरों का उल्लेख करते हैं तो हम परिभाषा और घोषणा शब्दों का सावधानीपूर्वक उपयोग कर रहे हैं। परिभाषा उस स्थान को संदर्भित करता है जहां चर बनाया जाता है या भंडारण सौंपा जाता है; घोषणा उन स्थानों को संदर्भित करता है जहां चर की प्रकृति बताई गई है किन्तु कोई भंडारण आवंटित नहीं किया गया है।
क्षेत्र, जीवनकाल और static
कीवर्ड
प्रोग्राम के सभी मॉड्यूल में सभी कार्यों द्वारा बाहरी चर का उपयोग किया जा सकता है। यह वैश्विक चर है। फ़ंक्शन के लिए चर का उपयोग करने में सक्षम होने के लिए, स्रोत कोड में फ़ंक्शन परिभाषा से पूर्व घोषणा या बाहरी चर की परिभाषा होनी चाहिए। या कीवर्ड के साथ extern
, फंक्शन के अंदर चर की घोषणा होनी चाहिए।
स्थैतिक कीवर्ड static
(static
और extern
पारस्परिक रूप से अनन्य हैं), बाहरी चर की परिभाषा पर प्रारम्भ होता है, इसे थोड़ा परिवर्तित कर देता है। चर को केवल उसी मॉड्यूल में फ़ंक्शंस द्वारा एक्सेस किया जा सकता है जहां इसे परिभाषित किया गया था। किन्तु मॉड्यूल में फ़ंक्शन के लिए चर के संदर्भ (सूचक) को दूसरे मॉड्यूल में किसी अन्य फ़ंक्शन में निकट करना संभव है। इस स्थिति में, फ़ंक्शन किसी अन्य मॉड्यूल में है, यह चर की सामग्री को पढ़ और संशोधित कर सकता है,यह सिर्फ नाम से इसका उल्लेख नहीं कर सकता हैं।
स्थानीय चर की परिभाषा पर शोधशब्द का प्रयोग करना भी संभव है। static
कीवर्ड के बिना फ़ंक्शन को कॉल किए जाने पर चर स्वचालित रूप से आवंटित किया जाता है और फ़ंक्शन से बाहर निकलने पर प्रचलित किया जाता है (इस प्रकार नाम स्वचालित चर)। फ़ंक्शन कॉल के मध्य इसका मान नहीं रखा जाता है। static
कीवर्ड के साथ, कार्यक्रम प्रारम्भ होने पर चर आवंटित किया जाता है और कार्यक्रम समाप्त होने पर प्रचलित किया जाता है। फ़ंक्शन कॉल के मध्य इसका मान लुप्त नहीं हो जाता है। चर अभी भी स्थानीय है, क्योंकि इसे केवल उस फ़ंक्शन के अंदर नाम से ही एक्सेस किया जा सकता है जिसने इसे परिभाषित किया है। किन्तु इसके लिए संदर्भ (सूचक) किसी अन्य फ़ंक्शन को निकट किया जा सकता है, जिससे इसे चर की सामग्री को पढ़ने और संशोधित करने की अनुमति मिलती है (नाम से संदर्भित किए बिना)।
प्रोग्राम प्रारम्भ होने पर बाहरी चर आवंटित और आरंभ किए जाते हैं, और प्रोग्राम समाप्त होने पर ही मेमोरी प्रचलित की जाती है। उनका जीवनकाल कार्यक्रम के समान ही है।
यदि प्रारम्भिकरण स्पष्ट रूप से नहीं किया गया है, तो बाहरी (स्थिर या नहीं) और स्थानीय स्थिर चर को शून्य से आरंभ किया जाता है। स्थानीय स्वचालित चर अप्रारंभीकृत हैं, अर्थात ट्रैश मान सम्मिलित हैं। फ़ंक्शन परिभाषा पर प्रारम्भ किया गया static
कीवर्ड फ़ंक्शन के लिंकेज को परिवर्तित कर देता है, जिससे यह केवल अनुवाद इकाई से दिखाई दे जहां इसकी परिभाषा स्थित है। यह फ़ंक्शन को इसके मॉड्यूल के बाहर से नाम से बुलाए जाने से रोकता है (मॉड्यूल से फंक्शन सूचक को निकट करना संभव है और फ़ंक्शन का आह्वान करने के लिए इसका उपयोग करना संभव है)। static
कीवर्ड का उपयोग करके किसी फ़ंक्शन को घोषित करना भी नाम के टकराव से बचने के लिए उसका नाम अल्प रखने की उत्तम प्रविधि है।
उदाहरण (सी प्रोग्रामिंग भाषा)
फ़ाइल 1:
// Explicit definition, this actually allocates
// as well as describing
int global_variable;
// Function prototype (declaration), assumes
// defined elsewhere, normally from include file.
void some_function(void);
int main(void) {
global_variable = 1;
some_function();
return 0;
}
फ़ाइल 2:
// Implicit declaration, this only describes and
// assumes allocated elsewhere, normally from include
extern int global_variable;
// Function header (definition)
void some_function(void) {
++global_variable;
}
इस उदाहरण में, चर Global_Variable को फ़ाइल 1 में परिभाषित किया गया है। फ़ाइल 2 में समान चर का उपयोग करने के लिए, इसे घोषित किया जाना चाहिए। फ़ाइलों की संख्या के पश्चात भी, वैश्विक चर को परिभाषित किया जाता है; चूंकि, इसे परिभाषा वाली फ़ाइल के बाहर किसी भी फ़ाइल में घोषित किया जाना चाहिए।
If the program is in several source files, and a variable is defined in file1 and used in file2 and file3, then extern declarations are needed in file2 and file3 to connect the occurrences of the variable. The usual practice is to collect extern declarations of variables and functions in a separate file, historically called a header, that is included by #include at the front of each source file. The suffix .h is conventional for header names.
सी फाइलों में जाने के लिए सामान्य पद्धति आवंटन और वास्तविक परिभाषाओं के लिए है, किन्तु केवल घोषणाएं और प्रोटोटाइप आवंटित नहीं होते हैं और केवल प्रकार और पैरामीटर का वर्णन करते हैं जिससे संकलक उचित रूप से कार्य कर सके, और वह जानकारी एच हेडर फ़ाइल में है जो अन्य बिना किसी संभावित संघर्ष के सुरक्षित रूप से सम्मिलित कर सकते हैं।
यह भी देखें
- घोषणा
- फंक्शन प्रोटोटाइप – Declaration of a function's name and type signature but not body
- वैश्विक चर – Computer programming, a variable accessible throughout a computer program
- लिंकर (कंप्यूटिंग)
- स्थानीय चर – Computer programming, a variable only usable in a portion of a program (the scope)
- क्षेत्र
- स्थैतिक चर
- सी प्रोग्रामिंग लैंग्वेज
बाहरी संबंध
- Microsoft C Language Reference: Storage-Class Specifiers for External-Level Declarations
- "The C Standard (C99 with Technical corrigenda TC1, TC2, and TC3 included)" (PDF). (3.61 MiB). In particular, see sections 6.2.2 (Linkage of identifiers), 6.2.4 (Storage duration of objects), 6.7.1 (Storage-class specifiers) and 6.9 (External definitions).