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

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

"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

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

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

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

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