आपको दो अलग-अलग अवधारणाओं के बीच अंतर करने की आवश्यकता है: फ़ंक्शन परिभाषा और प्रतीक घोषणा। "एक्सटर्न" एक लिंकेज संशोधक है, जो संकलक के लिए एक संकेत है जहां बाद में संदर्भित प्रतीक परिभाषित किया गया है (संकेत है, "यहां नहीं")।
अगर मैं लिखता
extern int i;
फ़ाइल स्कोप में (एक फंक्शन ब्लॉक के बाहर) सी फाइल में, फिर आप कह रहे हैं "वेरिएबल को कहीं और परिभाषित किया जा सकता है"।
extern int f() {return 0;}
फ़ंक्शन f की एक घोषणा और फ़ंक्शन f की परिभाषा दोनों है। इस मामले में परिभाषा बाहरी पर सवारी करती है।
extern int f();
int f() {return 0;}
पहले एक घोषणा है, उसके बाद परिभाषा है।
extern
यदि आप घोषित करना चाहते हैं और एक साथ फ़ाइल स्कोप वैरिएबल को परिभाषित करना चाहते हैं तो इसका उपयोग गलत है। उदाहरण के लिए,
extern int i = 4;
संकलक के आधार पर एक त्रुटि या चेतावनी देगा।
का उपयोग extern
यदि आप स्पष्ट रूप से किसी चर की परिभाषा से बचना चाहते हैं तो इसका उपयोगी है।
मुझे समझाने दो:
मान लें कि फ़ाइल एसी में है:
#include "a.h"
int i = 2;
int f() { i++; return i;}
फ़ाइल आह में शामिल हैं:
extern int i;
int f(void);
और फ़ाइल bc में शामिल है:
#include <stdio.h>
#include "a.h"
int main(void){
printf("%d\n", f());
return 0;
}
हेडर में बाहरी उपयोगी है, क्योंकि यह लिंक चरण के दौरान संकलक को बताता है, "यह एक घोषणा है, और परिभाषा नहीं है"। अगर मैं एसी को लाइन में हटाता हूं जो i को परिभाषित करता है, तो इसके लिए जगह आवंटित करता है और इसके लिए एक मान प्रदान करता है, प्रोग्राम को एक अपरिभाषित संदर्भ के साथ संकलन करने में विफल होना चाहिए। यह डेवलपर को बताता है कि उसने एक चर का उल्लेख किया है, लेकिन अभी तक इसे परिभाषित नहीं किया है। यदि दूसरी ओर, मैं "बाहरी" कीवर्ड को छोड़ देता हूं, और हटा देता हूंint i = 2
लाइन को , तो प्रोग्राम अभी भी संकलित करता है - मुझे 0 के डिफ़ॉल्ट मान के साथ परिभाषित किया जाएगा।
फ़ाइल स्कोप वैरिएबल को स्पष्ट रूप से 0 या NULL के डिफ़ॉल्ट मान के साथ परिभाषित किया जाता है यदि आप स्पष्ट रूप से उनके लिए कोई मान असाइन नहीं करते हैं - ब्लॉक-स्कोप वैरिएबल के विपरीत जिसे आप किसी फ़ंक्शन के शीर्ष पर घोषित करते हैं। बाहरी कीवर्ड इस निहित परिभाषा से बचता है, और इस प्रकार गलतियों से बचने में मदद करता है।
फ़ंक्शन के लिए, फ़ंक्शन घोषणाओं में, कीवर्ड वास्तव में अनावश्यक है। फंक्शन घोषणाओं में निहित परिभाषा नहीं होती है।