C++ में ग्लोबल वेरिएबल्स घोषित करने के लिए, हम प्रोग्राम की शुरुआत के बाद वेरिएबल्स घोषित कर सकते हैं। किसी फ़ंक्शन या ब्लॉक के अंदर नहीं। यदि हम कुछ वेरिएबल्स घोषित करना चाहते हैं जो किसी अन्य फ़ाइल में संग्रहीत होंगे, तो हम एक फ़ाइल बना सकते हैं और उसमें कुछ वेरिएबल स्टोर कर सकते हैं। किसी बाहरी फ़ाइल के लिए कभी-कभी हमें इसके साथ extern कीवर्ड लगाना पड़ता है। साथ ही हमें बाहरी फ़ाइल को वास्तविक प्रोग्राम फ़ाइल के साथ शामिल करना होगा।
उदाहरण: ग्लोबल वेरिएबल फ़ाइल (global.cpp)
// global.cpp int x = 10; int y = 20;
नोट: extern कीवर्ड का उपयोग घोषणा (declaration) में किया जाता है, परिभाषा (definition) में नहीं। परिभाषा फ़ाइल में केवल परिभाषा होनी चाहिए।
उदाहरण: मुख्य फ़ाइल (main.cpp)
// main.cpp
#include <iostream>
// #include "global.cpp" // गलत: .cpp फ़ाइल शामिल न करें!
// इसके बजाय, हेडर फ़ाइल में extern घोषणा करें
// global.h
#ifndef GLOBAL_H
#define GLOBAL_H
extern int x; // घोषणा: परिभाषा कहीं और है
extern int y;
#endif
// main.cpp में:
#include "global.h"
using namespace std;
int main() {
cout << x << endl;
cout << y << endl;
return 0;
}
कंपाइल और रन
$ g++ global.cpp main.cpp -o global_demo $ ./global_demo 10 20
मुख्य अवधारणाएं
1. ग्लोबल वेरिएबल परिभाषा vs घोषणा
| पहलू | परिभाषा (Definition) | घोषणा (Declaration) |
|---|---|---|
| कीवर्ड | कोई नहीं (सिर्फ टाइप नाम) | extern |
| मेमोरी आवंटन | हां | नहीं |
| इनिशियलाइज़ेशन | अनुमत | अनुमत नहीं (C++17 से inline वेरिएबल्स में अनुमत) |
| स्थान | एक .cpp फ़ाइल में | हेडर फ़ाइल में (.h) |
| बहुगुणता | प्रोग्राम में ठीक एक | कई फ़ाइलों में शामिल हो सकता है |
2. इंटरनल लिंकेज (फाइल-लोकल ग्लोबल)
// file.cpp
static int file_local = 42; // केवल इस फाइल में दृश्यमान
// या C++17+
namespace {
int file_local = 42; // अनाम नेमस्पेस (पसंदीदा)
}
3. C++17 इंलाइन वेरिएबल्स (हेडर-ओनली ग्लोबल्स)
// global.hpp #pragma once inline int global_counter = 0; // परिभाषा + घोषणा एक साथ // एकाधिक .cpp फ़ाइलें इसे शामिल कर सकती हैं - लिंकर इसे मर्ज कर देगा
सर्वोत्तम अभ्यास
- ग्लोबल वेरिएबल्स से बचें - वे कपलिंग बढ़ाते हैं और टेस्टिंग कठिन बनाते हैं।
- सिंगलटन/कॉन्फिग ऑब्जेक्ट्स का उपयोग करें यदि साझा स्थिति आवश्यक है।
externका उपयोग करके घोषणा और परिभाषा अलग करें।- थ्रेड सेफ्टी पर विचार करें - ग्लोबल्स पर सिंक्रोनाइज़ेशन की आवश्यकता होती है।
- const ग्लोबल्स डिफ़ॉल्ट रूप से इंटरनल लिंकेज रखते हैं (C++ में),
extern constका उपयोग करके एक्सटर्नल लिंकेज बनाएं।