C में स्टैटिक स्कोपिंग
यहां हम देखेंगे कि C वेरिएबल्स कैसे स्कोप्ड होते हैं। C में वेरिएबल्स हमेशा **स्टैटिकली स्कोप्ड** (लेक्सिकली स्कोप्ड) होते हैं। एक वेरिएबल की बाइंडिंग, प्रोग्राम टेक्स्ट द्वारा निर्धारित की जा सकती है। ये रनटाइम फ़ंक्शन कॉल स्टैक से स्वतंत्र हैं।
उदाहरण
#include <stdio.h>
int x = 0; // ग्लोबल x
int my_function() {
return x; // हमेशा ग्लोबल x का उपयोग करता है
}
int my_function2() {
int x = 1; // लोकल x (ग्लोबल को छुपाता है)
return my_function(); // my_function को कॉल करता है
}
int main() {
printf("The value is: %d\n", my_function2());
return 0;
}
आउटपुट
The value is: 0
व्याख्या
परिणाम 0 है। क्योंकि my_function() द्वारा रिटर्न किया गया मान उस फ़ंक्शन पर निर्भर नहीं करता जो इसे कॉल कर रहा है। यह फ़ंक्शन हमेशा ग्लोबल वेरिएबल x का मान लौटाता है। my_function2 में लोकल x का my_function पर कोई प्रभाव नहीं पड़ता।
स्टैटिक vs डायनामिक स्कोपिंग
| पहलू | स्टैटिक (लेक्सिकल) स्कोपिंग | डायनामिक स्कोपिंग |
|---|---|---|
| बाइंडिंग समय | कंपाइल टाइम | रनटाइम |
| निर्धारित होता है | सोर्स कोड संरचना द्वारा | कॉल स्टैक द्वारा |
| उदाहरण भाषाएं | C, C++, Java, Python | पुराना Lisp, Perl (local), Bash |
| उपरोक्त उदाहरण में परिणाम | 0 (ग्लोबल x) | 1 (कॉलर का x होता) |
C में स्कोप नियम
1. ब्लॉक स्कोप
void func() {
int a = 1; // func के ब्लॉक तक स्कोप
if (true) {
int b = 2; // इस ब्लॉक तक स्कोप
// a यहाँ विजिबल है
}
// b यहाँ विजिबल नहीं है
}
2. फाइल स्कोप (ग्लोबल)
int global = 10; // इस फाइल में सभी जगह विजिबल static int file_private = 20; // केवल इस फाइल में विजिबल (इंटरनल लिंकेज)
3. फंक्शन प्रोटोटाइप स्कोप
void func(int x); // x केवल इस प्रोटोटाइप तक स्कोप्ड
4. फंक्शन स्कोप (लेबल्स)
void func() {
goto label; // label पूरे फंक्शन में विजिबल
// ...
label:
;
}
शैडोइंग
आंतरिक स्कोप में वेरिएबल बाहरी स्कोप के समान नाम वाले वेरिएबल को छुपा सकता है:
int x = 10; // ग्लोबल
void func() {
int x = 20; // ग्लोबल x को शैडो करता है
{
int x = 30; // दोनों को शैडो करता है
// यहाँ x = 30
}
// यहाँ x = 20
}
// यहाँ x = 10
बेस्ट प्रैक्टिसेज
- ग्लोबल वेरिएबल्स से बचें; पैरामीटर्स पास करें
- सबसे संकीर्ण संभव स्कोप का उपयोग करें
- शैडोइंग से बचें (कंपाइलर वार्निंग्स सक्षम करें:
-Wshadow) - फाइल-प्राइवेट ग्लोबल्स के लिए
staticका उपयोग करें - कॉन्स्टेंट्स के लिए
constऔरconstexprपसंद करें