Storage Classes
Scope और lifetime: दो बड़े विचार
C में हर variable की value के अलावा दो गुण होते हैं: scope (कहाँ इस्तेमाल हो सकता है) और lifetime (memory में कितनी देर रहता है)। Storage classes बस वे चार keywords हैं जो इन दो चीज़ों को नियंत्रित करते हैं।
यह lesson रोज़मर्रा के उदाहरणों से समझ बनाता है। संक्षिप्त reference-शैली version के लिए C में storage classes भी देखें।
| विचार | यह किसका उत्तर देता है |
|---|---|
| Scope | यह variable कहाँ इस्तेमाल कर सकता हूँ? |
| Lifetime | यह कितनी देर अपनी value रखता है? |
auto: रोज़मर्रा का default
हर सामान्य local variable auto है — आपको यह शब्द कभी टाइप नहीं करना पड़ता। यह अपने block के चलने पर बनता और block के खत्म होने पर चला जाता है।
void demo() {
int x = 5; // yah default se auto hai
// 'auto int x = 5;' ka matlab bilkul wahi hai
} // x yahan gayab ho jata hairegister: गति का संकेत
register compiler से कहता है कि हो सके तो variable को तेज़ CPU register में रखे — बहुत इस्तेमाल होने वाले loop counter के लिए उपयोगी। यह सिर्फ़ एक संकेत है; आधुनिक compilers आमतौर पर खुद बेहतर तय करते हैं।
for (register int i = 0; i < 1000; i++) {
// i speed ke liye CPU register mein rakha ja sakta hai
}चूँकि register variable सामान्य memory में न हो, आप उस पर & इस्तेमाल नहीं कर सकते।
static: याद रखने वाली memory
static local variable केवल एक बार बनता है और calls के बीच अपनी value रखता है — यह गिनने के लिए बढ़िया कि function कितनी बार चला।
#include <stdio.h>
void counter() {
static int count = 0; // ek baar bana, yaad rakha
count++;
printf("Called %d times\n", count);
}
int main() {
counter(); counter(); counter();
return 0;
}Called 1 times
Called 2 times
Called 3 times
static के बिना, count हर call में 0 पर reset होकर हमेशा 1 print करता।
extern: files के बीच साझा
extern कई source files को एक ही global variable इस्तेमाल करने देता है। आप इसे एक बार define करते हैं, और जहाँ भी चाहिए वहाँ extern से declare करते हैं।
// file1.c int total = 100; // asli definition // file2.c extern int total; // "yah doosri file mein hai" // ab file2 total istemaal kar sakti hai
चारों एक नज़र में
| Class | Scope | Lifetime | आम उपयोग |
|---|---|---|---|
auto | Local block | Block खत्म होने तक | सामान्य local variables |
register | Local block | Block खत्म होने तक | तेज़ loop counters (संकेत) |
static | Local या file | पूरा program | State याद रखना; file के globals छिपाना |
extern | सभी files | पूरा program | Global को files में साझा करना |
आम गलतियाँ
- सामान्य local से value याद रखने की उम्मीद करना — आपको
staticचाहिए। registervariable पर&इस्तेमाल करना (अनुमति नहीं)।externvariable दो files में define करना — एक बार define करें, बाकी में declare।staticकी दो भूमिकाएँ मिलाना: state याद रखना (local) बनाम छिपाना (file स्तर)।
एक function लिखें जिसमें static counter हो जो बताए वह कितनी बार चला, और उसे loop में पाँच बार call करें। फिर static हटाएँ और output को सब 1 में बदलते देखें।
सारांश
- Storage classes variable का scope और lifetime तय करते हैं।
autolocal variables का default है (block scope, छोटा जीवन)।registervariable को तेज़ register में रखने का संकेत देता है।staticcalls के बीच value याद रखता है, या file के globals छिपाता है।externएक global variable को कई files में साझा करता है।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
C में storage class क्या है?
auto, register, static और extern — हर एक इन्हें अलग तरह तय करता है।Scope और lifetime में क्या अंतर है?
C में static keyword क्या करता है?
static local variable को हर बार नया बनने के बजाय calls के बीच अपनी value रखने देता है, तो वह call count जैसी state याद रख सकता है। File स्तर पर, static variable या function को उसी एक file तक सीमित करता है, दूसरों से छिपाते हुए।C में default storage class क्या है?
auto होते हैं, यानी वे block चलने पर बनते और खत्म होने पर नष्ट होते हैं, और केवल उसी block के अंदर दिखते हैं। आप auto keyword लगभग कभी नहीं लिखते क्योंकि यह पहले से default है।extern storage class किसलिए इस्तेमाल होता है?
extern घोषित करता है कि variable किसी दूसरी file में define है, कई source files को एक global variable साझा करने देते हुए। आप variable एक बार बिना extern के define करते हैं, और उसी variable को संदर्भित करने को दूसरी files में extern इस्तेमाल करते हैं।