2014-12-18 5 views
5

मैं कुछ समय से सी में विकसित हो रहा हूं, ऑब्जेक्ट-उन्मुख भाषाओं जैसे सी ++ और जावा से आ रहा हूं, और fread() और strtok() जैसे मानक लाइब्रेरी फ़ंक्शंस का उपयोग करते समय, मुझे आश्चर्य हुआ: ये फ़ंक्शन संबंधित चर को संग्रहीत करने के बारे में कैसे जाते हैं उनके राज्य में?सी पुस्तकालय राज्य चर कैसे स्टोर करते हैं?

उदाहरण के लिए, strtok() बाद के कॉल के लिए अलग-अलग व्यवहार करता है, और fread() फ़ाइल में आपकी स्थिति का ट्रैक रखता है। इस जानकारी को कहीं भी संग्रहीत किया जाना चाहिए, और किसी ऑब्जेक्ट-उन्मुख भाषा में अवांछित संशोधन से इन मानों की रक्षा के लिए private या protected जैसे दायरे की संरचनाएं हैं, लेकिन जहां तक ​​मुझे समझ में आता है कि सी में ये नहीं है।

तो फिर, वे सुरक्षित रूप से कैसे संग्रहीत किए जाते हैं? या वे वास्तव में कहीं भी वैश्विक और संशोधित हैं? सवाल तब उत्पन्न हुआ जब मैं उपयोगिता कार्यों के साथ एक हेडर फ़ाइल लिख रहा था जिसे समान राज्य जानकारी स्टोर करने की आवश्यकता थी। सी में इस तरह की चीज करने का "सही" तरीका क्या है, और यह मौजूदा पुस्तकालयों में कैसे संभाला जाता है?

+3

'क्योंकि यह एक' FILE' struct जो सभी जानकारी 'fread' द्वारा आवश्यक संग्रहीत करता है लेता है fread', कॉल के बीच राज्य को बचाने के लिए की जरूरत नहीं है। –

उत्तर

7

ये कॉल static चर का उपयोग करती हैं। स्थानीय स्थैतिक चर फ़ंक्शन कॉल के बीच अपना मान बरकरार रखता है। एक वैश्विक स्थैतिक चर या फ़ंक्शन केवल उसी फ़ाइल में घोषित अन्य कार्यों द्वारा पहुंच योग्य है।

+0

बस एक साइड नोट के रूप में, उदाहरण के लिए, एक स्थिर ग्लोबल वेरिएबल (फ़ाइल स्कोप) तक पहुंचने के लिए अभी भी संभव है, इसे एक पॉइंटर (पता) को चर में पास करके। – Jite

+0

_in वही फ़ाइल_ भाग था जो मैं याद कर रहा था। मुझे नहीं पता था कि वैश्विक स्थैतिक चर तक पहुंच फ़ाइल द्वारा प्रतिबंधित थी। धन्यवाद! – dasizeman

+1

@sizeman बस ध्यान दें, जैसा कि मैंने उपरोक्त व्याख्या करने की कोशिश की है, यह * लिंकर * है जो इसे फ़ाइल के बाहर नहीं देख सकता है, हालांकि यदि आपके पास वैश्विक 'स्थिर int 'के साथ फ़ाइल' ए' है 'तो आप पास कर सकते हैं फ़ाइल 'बी'' के लिए 'a' का पता और अभी भी फ़ाइल 'बी' से चर का उपयोग करें। मुझे लगता है कि यह जानना महत्वपूर्ण है, भले ही यह ऐसा कुछ न हो जो आप रोज करते हैं। – Jite

8

फ़्रेड() के मामले में राज्य को एक FILE संरचना में संग्रहीत किया जाता है। संरचना fopen() द्वारा आवंटित संसाधन है जो इसके लिए एक सूचक देता है, और आप उस फ़ाइल को प्रत्येक फ़ाइल ऑपरेशन कॉल में पास करते हैं। संसाधन जारी किया जाता है जब fclose() कहा जाता है। FILE संसाधन को स्थिर पूल से आवंटित किया जा सकता है या इसे गतिशील रूप से ढेर से आवंटित किया जा सकता है - जो कार्यान्वयन पर निर्भर करेगा। उदाहरण के लिए:

RESOURCE* getResource() 
{ 
    return malloc(sizeof(RESOURCE)) ; 
} 

int useResource(RESOURCE* r) 
{ 
    return r.index++ ; 
} 

void releaseResource(RESOURCE* r) 
{ 
    free(r) ; 
} 

strtok() दूसरी ओर एक आंतरिक स्थिर सूचक है कि जब एक स्ट्रिंग पारित कर दिया है और जब एक नल पॉइंटर पारित हो जाता है प्रारंभिक बिंदु के रूप में प्रयोग किया जाता initialised होता है।

उदाहरण के लिए:

int getState() 
{ 
    static int state = 0 ; 
    return state++ ; 
} 

int main() 
{ 
    int s ; 

    do 
    { 
     s = getState() ; 
     printf("state = %d\n", s ; 

    } while(s < 10) ; 
} 
+0

अपने दूसरे कोड स्निपेट में कुछ स्पष्टीकरण के लिए अपने उदाहरण का उपयोग करके, मैं 'राज्य' तक नहीं पहुंच सका और न ही इसे 'मुख्य()' सही से सीधे पॉइंटर बना सकता हूं? – dasizeman

+1

@sizeman: सही, गेटस्टेट फ़ंक्शन को पॉइंटर को getResource उदाहरण में स्पष्ट रूप से वापस करना होगा, क्योंकि इसके राज्य को बाहरी रूप से एक्सेस किया जाना चाहिए। ये एकमात्र संभावनाएं नहीं हैं, वे केवल फ्रेड और स्ट्रोक द्वारा उपयोग किए जाने वाले दृष्टिकोण हैं। कोई संकेतक या इंडेक्स को आंतरिक रूप से आयोजित डेटा में उदाहरण के लिए, पॉइंटर या अपारदर्शी प्रकार के बजाय वापस कर सकता है। – Clifford

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