एक्सटर्नल वेरिएबल

From Vigyanwiki
Revision as of 16:07, 26 May 2023 by alpha>Artiverma

सी प्रोग्रामिंग भाषा में, बाहरी चर किसी भी फ़ंक्शन ब्लॉक के बाहर परिभाषित चर है। दूसरी ओर, स्थानीय (स्वचालित) चर फ़ंक्शन ब्लॉक के अंदर परिभाषित चर है।

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 कीवर्ड का उपयोग किया जाना चाहिए, अन्यथा संकलक इसे स्थानीय चर की परिभाषा मानेगा, जिसकी भिन्न सीमा, जीवनकाल और प्रारंभिक मूल्य है। यह घोषणा सम्पूर्ण फंक्शन के मॉड्यूल के अतिरिक्त केवल फंक्शन के अंदर ही दिखाई देगी। फ़ंक्शन प्रोटोटाइप पर प्रारम्भ extern कीवर्ड बिल्कुल कुछ नहीं करता है ( फ़ंक्शन परिभाषा पर प्रारम्भ 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 फ़ंक्शन परिभाषा पर प्रारम्भ किया गया 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.

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

यह भी देखें

बाहरी संबंध

  • 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).