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

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

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

- The C Programming Language

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

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

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

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

- The C Programming Language

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

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

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

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

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

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

फ़ाइल 2:

इस उदाहरण में, चर Global_Variable को फ़ाइल 1 में परिभाषित किया गया है। फ़ाइल 2 में समान चर का उपयोग करने के लिए, इसे घोषित किया जाना चाहिए। फ़ाइलों की संख्या के पश्चात भी, वैश्विक चर को परिभाषित किया जाता है; चूंकि, इसे परिभाषा वाली फ़ाइल के बाहर किसी भी फ़ाइल में घोषित किया जाना चाहिए।

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

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