2009-08-25 11 views
14

मैं "बाहरी" कीवर्ड की उपयोगिता पर सवाल उठाना शुरू कर रहा हूं जिसका प्रयोग अन्य मॉड्यूल (अन्य फ़ाइलों में) में चर/कार्यों तक पहुंचने के लिए किया जाता है। क्या हम वही काम नहीं कर रहे हैं जब हम चरम/फ़ंक्शन प्रोटोटाइप या फ़ंक्शन/चर परिभाषाओं के साथ हेडर फ़ाइल आयात करने के लिए # अंतर्निहित प्रीप्रोसेसर का उपयोग कर रहे हैं?बाहरी और # हेडर फ़ाइलों को शामिल करने के बीच क्या अंतर है?

उत्तर

17

extern की आवश्यकता है क्योंकि यह घोषणा करता है कि प्रतीक मौजूद है और एक निश्चित प्रकार का है, और इसके लिए भंडारण आवंटित नहीं करता है।

यदि आप कार्य करें:

int foo; 

एक हेडर फाइल में कई स्रोत फ़ाइलों के बीच साझा किया जाता है, तो आप एक लिंकर त्रुटि क्योंकि प्रत्येक स्रोत बनाया foo की अपनी एक प्रतिलिपि होता मिलेगा और लिंकर में असमर्थ रहेंगे प्रतीक को हल करने के लिए।

इसके बजाय, यदि आपके पास:

extern int foo; 

हैडर में, यह एक प्रतीक है कि प्रत्येक स्रोत फ़ाइल में कहीं परिभाषित किया गया है की घोषणा करेंगे।

एक (और केवल एक) स्रोत फ़ाइल

int foo; 

जो लिंकर को हल करने के लिए foo का एक उदाहरण बनाता है होते हैं।

+2

लेकिन क्या आप अभी भी बाहरी int foo के साथ घोषित किए बिना int foo तक पहुंच नहीं सकते हैं, जब तक कि आप इसकी परिभाषा वाले हेडर फ़ाइल को शामिल करते हैं? –

+2

जैसा कि जेकोपेन्हा ने उल्लेख किया है, # शामिल है बस शामिल फ़ाइल से टेक्स्ट को स्रोत फ़ाइल में सम्मिलित करता है - संकलक वास्तव में फ़ाइलों को शामिल करने के बारे में नहीं जानता है और विशेष रूप से उनका इलाज नहीं करता है। तो यदि आपके पास A.c, B.c, और C.c है, प्रत्येक "int foo" के साथ है और आप उन्हें एक साथ जोड़ते हैं, तो आप foo को कैसे हल करते हैं? यह 3 अलग-अलग स्थानों में मौजूद है। बाहरी का मतलब है, प्रतीक कहीं और मौजूद है। आप इसका उपयोग कर सकते हैं, लेकिन कोई और इसे बनाने के लिए ज़िम्मेदार है। – Michael

+0

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

2

नहीं # समावेशन एक प्रीप्रोसेसर कमांड है जो कहता है "इस पाठ को सभी अन्य फाइलों से यहां रखें"। इसलिए, शामिल फ़ाइल में सभी फ़ंक्शंस और चर वर्तमान फ़ाइल में परिभाषित किए गए हैं।

संबंधित मुद्दे