C++ में extern: फ़ाइलों के बीच वेरिएबल शेयर करने की पूरी गाइड

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

आपका कोड क्यों नहीं बन रहा: C++ में extern का रहस्य

\n\n

क्या आपने कभी C++ में एक साफ-सुथरा प्रोग्राम लिखा, उसे कई फ़ाइलों में बांटा, कंपाइल किया — और multiple definition of 'myVariable' या undefined reference to 'myVariable' जैसी ढेरों एरर मिलीं? परिचित लगता है? अगर हाँ, तो आप अकेले नहीं हैं। Stack Overflow पर "How do I use extern to share variables between source files?" सवाल सबसे लोकप्रिय में से एक है, जिसे हज़ारों बार देखा गया है।

\n\n

समस्या सरल है: जब प्रोजेक्ट बड़ा होता है, तो सारा कोड एक main.cpp में रखना नामुमकिन है। लेकिन ऐसा कैसे करें कि config.cpp में घोषित वेरिएबल game.cpp और render.cpp में दिखे? आप सोचते हैं: "बस इसे ग्लोबल घोषित कर दो!" — लेकिन कंपाइलर कुछ और ही सोचता है। यहाँ मदद करता है छोटा लेकिन शक्तिशाली कीवर्ड extern। आइए समझते हैं कि यह व्यवहार में कैसे काम करता है, ताकि आप फिर कभी लिंकिंग में न उलझें।

\n\n

extern क्या है और इसकी ज़रूरत क्यों है?

\n\n

C++ में, हर नाम (वेरिएबल, फंक्शन, क्लास) को उपयोग से पहले घोषित (declared) और ठीक एक बार परिभाषित (defined) होना चाहिए। परिभाषा वह है जो मेमोरी आवंटित करती है। घोषणा सिर्फ कंपाइलर से एक वादा है: "चिंता मत करो, परिभाषा किसी दूसरी फ़ाइल में है, मैं तुम्हें सिर्फ टाइप और नाम दिखा रहा हूँ।"

\n\n

कीवर्ड extern बिल्कुल यही वादा है। यह कंपाइलर से कहता है: "यह वेरिएबल कहीं और परिभाषित है, यहाँ इसके लिए मेमोरी मत आवंटित करो — बस मुझे इस तक पहुँच दो।"

\n\n

extern के बिना, दो .cpp फ़ाइलों में एक ग्लोबल वेरिएबल घोषित करने की हर कोशिश लिंकर एरर देगी: दो परिभाषाएँ — मेमोरी के दो टुकड़े — संघर्ष।

\n\n

तीन फ़ाइलों का नियम: कोड को कैसे व्यवस्थित करें

\n\n

C++ में फ़ाइलों के बीच वेरिएबल शेयर करने का मानक पैटर्न इस प्रकार है:

\n\n
    \n
  1. परिभाषा फ़ाइल (*.cpp) — इसमें वेरिएबल की एक परिभाषा होती है।
  2. \n
  3. हेडर फ़ाइल (*.h) — इसमें वेरिएबल का extern घोषणा होती है।
  4. \n
  5. कोई भी अन्य .cpp फ़ाइल — हेडर को शामिल करती है और वेरिएबल का उपयोग करती है।
  6. \n
\n\n

उदाहरण 1: एक पूर्णांक साझा करना

\n\n

मान लीजिए हम एक गेम लिख रहे हैं और एक अलग फ़ाइल में ग्लोबल स्कोर स्टोर करना चाहते हैं। इसे सही तरीके से करने का तरीका यहाँ है।

\n\n

फ़ाइल: globals.cpp — यहाँ असली वेरिएबल रहता है:

\n
// globals.cpp\n#include "globals.h"\n\nint gameScore = 0;  // परिभाषा: यहाँ मेमोरी आवंटित होती है
\n\n

फ़ाइल: globals.h — बाकी सभी के लिए घोषणा:

\n
// globals.h\n#ifndef GLOBALS_H\n#define GLOBALS_H\n\nextern int gameScore;  // घोषणा: "दूसरे .cpp में परिभाषा ढूँढो"\n\n#endif // GLOBALS_H
\n\n

फ़ाइल: main.cpp — वेरिएबल का उपयोग:

\n
// main.cpp\n#include <iostream>\n#include "globals.h"\n\nvoid updateScore(int points) {\n    gameScore += points;  // काम करता है! extern ने पहुँच दी\n}\n\nint main() {\n    gameScore = 100;\n    updateScore(50);\n    std::cout << "Score: " << gameScore << std::endl; // 150 प्रिंट करेगा\n    return 0;\n}
\n\n

फ़ाइल: display.cpp — एक और फ़ाइल जिसे पहुँच चाहिए:

\n
// display.cpp\n#include <iostream>\n#include "globals.h"\n\nvoid showScore() {\n    std::cout << "Current score: " << gameScore << std::endl;\n}
\n\n

ध्यान दें: gameScore ठीक एक बार परिभाषित हुआ है — globals.cpp में। बाकी सभी जगहों पर हम extern int gameScore (हेडर के माध्यम से) का उपयोग कर रहे हैं।

\n\n

सामान्य गलती #1: हेडर फ़ाइल में परिभाषा

\n\n

नए प्रोग्रामर अक्सर .h फ़ाइल में ऐसा लिखते हैं:

\n
// गलत: ba                

ब्लॉग

पुस्तक अनुशंसाएँ