एक्सटर्नल वेरिएबल
सी प्रोग्रामिंग भाषा में, बाहरी चर किसी भी फ़ंक्शन ब्लॉक के बाहर परिभाषित चर है। दूसरी ओर, स्थानीय (स्वचालित) चर फ़ंक्शन ब्लॉक के अंदर परिभाषित चर है।
As an alternative to automatic variables, it is possible to define variables that are external to all functions, that is, variables that can be accessed by name by any function. (This mechanism is rather like Fortran COMMON or Pascal variables declared in the outermost block.) Because external variables are globally accessible, they can be used instead of argument lists to communicate data between functions. Furthermore, because external variables remain in existence permanently, rather than appearing and disappearing as functions are called and exited, they retain their values even after the functions that set them have returned.
परिभाषा, घोषणा और extern
कीवर्ड
यह समझने के लिए कि बाह्य चर extern
कीवर्ड किस प्रकार संबंधित हैं, चर को परिभाषित करने और घोषित करने के मध्य के अंतर को जानना आवश्यक है। जब चर को परिभाषित किया जाता है, तो संकलक उस चर के लिए स्मृति आवंटित करता है और संभवतया इसकी सामग्री को कुछ मान में प्रारंभ करता है। जब चर घोषित किया जाता है, तो संकलक को चर को कहीं और परिभाषित करने की आवश्यकता होती है। घोषणापत्र संकलक को सूचित करता है कि उस नाम और प्रकार से चर उपस्थित है, किन्तु संकलक को इसके लिए स्मृति आवंटित करने की आवश्यकता नहीं है क्योंकि इसे कहीं और आवंटित किया गया है। extern
कीवर्ड का अर्थ है बिना परिभाषित किए घोषित करना, दूसरे शब्दों में, यह चर को स्पष्ट रूप से घोषित करने की प्रविधि है, या परिभाषा के बिना घोषणा को बाध्य करने की प्रविधि है। चर को स्पष्ट रूप से परिभाषित करना भी संभव है, अर्थात परिभाषा को बाध्य करना है। यह चर को प्रारंभिक मूल्य असाइन करके किया जाता है। यदि न तो extern
कीवर्ड और न ही प्रारंभिक मूल्य उपस्थित हैं, कथन या तो घोषणा या परिभाषा हो सकती है। यह कंपाइलर पर निर्भर करता है कि वह प्रोग्राम के मॉड्यूल्स का विश्लेषण करे और निर्धारित करे।
कार्यक्रम के मॉड्यूल में से एक में एक चर को ठीक एक बार परिभाषित किया जाना चाहिए। यदि कोई परिभाषा या एक से अधिक नहीं है, तो संभवतः लिंकिंग चरण में एक त्रुटि उत्पन्न होती है। एक चर को कई बार घोषित किया जा सकता है, जब तक कि घोषणाएं एक-दूसरे के साथ और परिभाषा के अनुरूप हों (कुछ ऐसा है जो शीर्षलेख फ़ाइलें बहुत सुविधा प्रदान करता है)। इसे कई मॉड्यूल में घोषित किया जा सकता है, जिसमें वह मॉड्यूल भी शामिल है जहां इसे परिभाषित किया गया था, और यहां तक कि एक ही मॉड्यूल में कई बार। किन्तु आमतौर पर मॉड्यूल में इसे एक से अधिक बार घोषित करना व्यर्थ होता है।
किसी फ़ंक्शन के अंदर एक बाहरी चर भी घोषित किया जा सकता है। इस मामले में extern
कीवर्ड का उपयोग किया जाना चाहिए, अन्यथा संकलक इसे एक स्थानीय (Automatic_variable) चर की परिभाषा मानेगा, जिसका एक अलग दायरा, जीवनकाल और प्रारंभिक मूल्य है। यह घोषणा पूरे फंक्शन के मॉड्यूल के बजाय केवल फंक्शन के अंदर ही दिखाई देगी। extern
e> किसी फ़ंक्शन प्रोटोटाइप पर लागू किया गया कीवर्ड बिल्कुल कुछ नहीं करता है ( extern
कीवर्ड फ़ंक्शन परिभाषा पर लागू होता है, ज़ाहिर है, गैर-सनसनीखेज)। एक फ़ंक्शन प्रोटोटाइप हमेशा एक घोषणा है और परिभाषा कभी नहीं। साथ ही, मानक सी में, एक फ़ंक्शन हमेशा बाहरी होता है, किन्तु कुछ कंपाइलर एक्सटेंशन फ़ंक्शन को फ़ंक्शन के अंदर परिभाषित करने की अनुमति देते हैं।
An external variable must be defined, exactly once, outside of any function; this sets aside storage for it. The variable must also be declared in each function that wants to access it; this states the type of the variable. The declaration may be an explicit
extern
statement or may be implicit from context. ... You should note that we are using the words definition and declaration carefully when we refer to external variables in this section. Definition refers to the place where the variable is created or assigned storage; declaration refers to places where the nature of the variable is stated but no storage is allocated.
दायरा, जीवनकाल और static
कीवर्ड
एक प्रोग्राम के सभी मॉड्यूल में सभी कार्यों द्वारा एक बाहरी चर का उपयोग किया जा सकता है। यह एक वैश्विक चर है। एक फ़ंक्शन के लिए चर का उपयोग करने में सक्षम होने के लिए, स्रोत कोड में फ़ंक्शन परिभाषा से पहले एक घोषणा या बाहरी चर की परिभाषा होनी चाहिए। या कीवर्ड के साथ चर की घोषणा होनी चाहिए extern
, समारोह के अंदर।
द स्टेटिक (कीवर्ड) |static
खोजशब्द (static
और extern
पारस्परिक रूप से अनन्य हैं), बाहरी चर की परिभाषा पर लागू होता है, इसे थोड़ा बदल देता है: चर को केवल उसी मॉड्यूल में फ़ंक्शंस द्वारा एक्सेस किया जा सकता है जहां इसे परिभाषित किया गया था। किन्तु एक ही मॉड्यूल में एक फ़ंक्शन के लिए चर के संदर्भ (सूचक) को दूसरे मॉड्यूल में किसी अन्य फ़ंक्शन में पास करना संभव है। इस मामले में, भले ही फ़ंक्शन किसी अन्य मॉड्यूल में है, यह चर की सामग्री को पढ़ और संशोधित कर सकता है-यह सिर्फ नाम से इसका उल्लेख नहीं कर सकता।
का प्रयोग करना भी संभव है static
स्थानीय चर की परिभाषा पर कीवर्ड। के बिना static
कीवर्ड, फ़ंक्शन को कॉल किए जाने पर चर स्वचालित रूप से आवंटित किया जाता है और फ़ंक्शन से बाहर निकलने पर जारी किया जाता है (इस प्रकार नाम स्वचालित चर)। फ़ंक्शन कॉल के मध्य इसका मान नहीं रखा जाता है। साथ static
कीवर्ड, कार्यक्रम शुरू होने पर चर आवंटित किया जाता है और कार्यक्रम समाप्त होने पर जारी किया जाता है। फ़ंक्शन कॉल के मध्य इसका मान खो नहीं जाता है। चर अभी भी स्थानीय है, क्योंकि इसे केवल उस फ़ंक्शन के अंदर नाम से ही एक्सेस किया जा सकता है जिसने इसे परिभाषित किया है। किन्तु इसके लिए एक संदर्भ (सूचक) किसी अन्य फ़ंक्शन को पास किया जा सकता है, जिससे इसे चर की सामग्री को पढ़ने और संशोधित करने की अनुमति मिलती है (फिर से नाम से संदर्भित किए बिना)।
प्रोग्राम शुरू होने पर बाहरी चर आवंटित और आरंभ किए जाते हैं, और प्रोग्राम समाप्त होने पर ही मेमोरी जारी की जाती है। उनका जीवनकाल कार्यक्रम के समान ही है।
यदि इनिशियलाइज़ेशन स्पष्ट रूप से नहीं किया गया है, तो बाहरी (स्थिर या नहीं) और स्थानीय स्थिर चर को शून्य से आरंभ किया जाता है। स्थानीय स्वचालित चर अप्रारंभीकृत हैं, अर्थात ट्रैश मान शामिल हैं। static
फ़ंक्शन परिभाषा पर लागू किया गया e> कीवर्ड फ़ंक्शन के लिंकेज को बदल देता है ताकि यह केवल अनुवाद इकाई से दिखाई दे जहां इसकी परिभाषा स्थित है। यह फ़ंक्शन को इसके मॉड्यूल के बाहर से नाम से बुलाए जाने से रोकता है (मॉड्यूल से समारोह सूचक को पास करना संभव है और फ़ंक्शन का आह्वान करने के लिए इसका उपयोग करना संभव है)। का उपयोग कर एक समारोह घोषित करना 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
- Function prototype
- Global variable
- Linker (computing)
- Local variable
- Scope
- Static variable
- The C Programming Language
बाहरी संबंध
- 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).