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

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

"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."

- The C Programming Language

परिभाषा, घोषणा और कीवर्ड
यह समझने के लिए कि बाह्य चर किस प्रकार संबंधित हैं  कीवर्ड, एक चर को परिभाषित करने और घोषित करने के बीच के अंतर को जानना आवश्यक है। जब एक चर को परिभाषित किया जाता है, तो संकलक उस चर के लिए स्मृति आवंटित करता है और संभवतया इसकी सामग्री को कुछ मान में प्रारंभ करता है। जब एक चर घोषित किया जाता है, तो संकलक को चर को कहीं और परिभाषित करने की आवश्यकता होती है। घोषणापत्र संकलक को सूचित करता है कि उस नाम और प्रकार से एक चर मौजूद है, लेकिन संकलक को इसके लिए स्मृति आवंटित करने की आवश्यकता नहीं है क्योंकि इसे कहीं और आवंटित किया गया है।   e> कीवर्ड का अर्थ है बिना परिभाषित किए घोषित करना। दूसरे शब्दों में, यह एक चर को स्पष्ट रूप से घोषित करने का एक तरीका है, या परिभाषा के बिना एक घोषणा को बाध्य करने का एक तरीका है। एक चर को स्पष्ट रूप से परिभाषित करना भी संभव है, अर्थात एक परिभाषा को बाध्य करना। यह एक वेरिएबल को इनिशियलाइज़ेशन वैल्यू असाइन करके किया जाता है। यदि न तो   कीवर्ड और न ही इनिशियलाइज़ेशन वैल्यू मौजूद हैं, स्टेटमेंट या तो डिक्लेरेशन या डेफिनिशन हो सकता है। यह कंपाइलर पर निर्भर है कि वह प्रोग्राम के मॉड्यूल्स का विश्लेषण करे और तय करे।

कार्यक्रम के मॉड्यूल में से एक में एक चर को ठीक एक बार परिभाषित किया जाना चाहिए। यदि कोई परिभाषा या एक से अधिक नहीं है, तो संभवतः लिंकिंग चरण में एक त्रुटि उत्पन्न होती है। एक चर को कई बार घोषित किया जा सकता है, जब तक कि घोषणाएं एक-दूसरे के साथ और परिभाषा के अनुरूप हों (कुछ ऐसा है जो शीर्षलेख फ़ाइलें बहुत सुविधा प्रदान करता है)। इसे कई मॉड्यूल में घोषित किया जा सकता है, जिसमें वह मॉड्यूल भी शामिल है जहां इसे परिभाषित किया गया था, और यहां तक ​​कि एक ही मॉड्यूल में कई बार। लेकिन आमतौर पर मॉड्यूल में इसे एक से अधिक बार घोषित करना व्यर्थ होता है।

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

"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 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."

- The C Programming Language

दायरा, जीवनकाल और कीवर्ड
एक प्रोग्राम के सभी मॉड्यूल में सभी कार्यों द्वारा एक बाहरी चर का उपयोग किया जा सकता है। यह एक वैश्विक चर है। एक फ़ंक्शन के लिए चर का उपयोग करने में सक्षम होने के लिए, स्रोत कोड में फ़ंक्शन परिभाषा से पहले एक घोषणा या बाहरी चर की परिभाषा होनी चाहिए। या कीवर्ड के साथ वेरिएबल की घोषणा होनी चाहिए, समारोह के अंदर।

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

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

प्रोग्राम शुरू होने पर बाहरी चर आवंटित और आरंभ किए जाते हैं, और प्रोग्राम समाप्त होने पर ही मेमोरी जारी की जाती है। उनका जीवनकाल कार्यक्रम के समान ही है।

यदि इनिशियलाइज़ेशन स्पष्ट रूप से नहीं किया गया है, तो बाहरी (स्थिर या नहीं) और स्थानीय स्थिर चर को शून्य से आरंभ किया जाता है। स्थानीय स्वचालित चर अप्रारंभीकृत हैं, अर्थात ट्रैश मान शामिल हैं।  फ़ंक्शन परिभाषा पर लागू किया गया e> कीवर्ड फ़ंक्शन के लिंकेज को बदल देता है ताकि यह केवल अनुवाद इकाई से दिखाई दे जहां इसकी परिभाषा स्थित है। यह फ़ंक्शन को इसके मॉड्यूल के बाहर से नाम से बुलाए जाने से रोकता है (मॉड्यूल से समारोह सूचक को पास करना संभव है और फ़ंक्शन का आह्वान करने के लिए इसका उपयोग करना संभव है)। का उपयोग कर एक समारोह घोषित करना   नाम के टकराव से बचते हुए अपने नाम को छोटा रखने के लिए कीवर्ड भी एक अच्छा तरीका है।

उदाहरण (सी प्रोग्रामिंग भाषा)
फ़ाइल 1:

फ़ाइल 2:

इस उदाहरण में, चर 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."

- The C Programming Language

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

बाहरी संबंध

 * Microsoft C Language Reference: Storage-Class Specifiers for External-Level Declarations
 * (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).