2014-12-18 19 views
5

C++ ve Java gibi nesne yönelimli dillerden gelen ve fread() ve strtok() gibi standart kütüphane işlevlerini kullanırken, şu an için C içinde geliştirmekteyim, merak etmeye başladım: Bu işlevler, değişkenler ile ilgili değişkenlerin depolanmasıyla nasıl ilgilidir? devletlerine mi? Örneğin, strtok(), sonraki aramalar için farklı davranır ve fread() dosyadaki konumunuzu takip eder. Bu bilginin bir yerde saklanması gerekir ve nesne yönelimli bir dilde, bu değerleri istenmeyen modifikasyonlardan korumak için private veya protected gibi kapsam yapıları vardır, fakat C'nin bunlara sahip olmadığı anlaşılır.C kitaplıkları durum değişkenlerini nasıl depolar?

Peki, nasıl güvenli bir şekilde depolanır? Yoksa aslında küresel ve herhangi bir yerden değiştirilebilir mi? Benzer durum bilgisini saklamak için gereken yardımcı işlevler içeren bir başlık dosyası yazarken soru ortaya çıktı. C'deki bu tür bir şeyi yapmanın “doğru” yolu nedir ve mevcut kütüphanelerde nasıl ele alınır?

+3

'o fread'' ihtiyaç duyduğu tüm bilgileri saklayan bir 'Dosya' yapı aldığından fread', çağrılar arasında devlet kaydetmek gerekmez. –

cevap

7

Bu çağrılar, static değişkenlerini kullanır. Yerel bir statik değişken, işlev çağrıları arasındaki değerini korur. Genel bir statik değişken veya bir işlev sadece aynı dosyada bildirilen diğer işlevler tarafından erişilebilir.

+0

Bir yan not olarak, örneğin, değişkene bir işaretçi (adres) ileterek, başka bir dosyadan statik bir genel değişkene (dosya kapsamı) ulaşmak mümkündür. – Jite

+0

Aynı dosya_ parçası _insin ben eksik vardı. Küresel statik değişkenlere erişimin dosya tarafından kısıtlandığını fark etmedim. Teşekkürler! – dasizeman

+1

@sizeman Sadece, yukarıda açıklamaya çalıştığım gibi, bu dosyanın dışında göremeyen * linker * olduğunu unutmayın, ancak bir dosya 'A' global' statik int a' varsa 'B' dosyasına 'a' adresi ve hala' B' dosyasından değişkene erişir. Her gün yaptığınız bir şey olmasa bile, bilmek önemli olduğunu düşünüyorum. – Jite

8

Fread() durumunda, durum bir DOSYA yapısında depolanır. Yapı, bir gösterici döndüren fopen() tarafından ayrılan bir kaynaktır ve bu işaretçiyi her dosya işlem çağrısına geçirirsiniz. Kaynak fclose() çağrıldığında serbest bırakılır. DOSYA kaynağı statik bir havuzdan ayrılabilir veya dinamik olarak yığından ayrılabilir; bu, uygulamaya bağımlıdır. Örneğin: Öte yandan

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

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

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

strtok() bir dizge ve bir boş gösterici geçirildiğinde başlangıç ​​noktası olarak kullanıldığı zaman, başlangıç ​​durumuna geri döner bir iç statik gösterici içerir. Örneğin

:

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

int main() 
{ 
    int s ; 

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

    } while(s < 10) ; 
} 
+0

Örnek vermek için, ikinci kod snippet'inizde bir şeyi açıklığa kavuşturarak 'state''e erişemedim veya doğrudan 'main()' dan bir işaretçi gösteremedim? – dasizeman

+1

@sizeman: Doğru, getState işlevinin, getResource örneğindeki gibi bir işaretçiyi açıkça döndürmesi gerekir, çünkü bu durumun dışarıdan erişilmesi gerekir. Bunlar tek olasılık değil, sadece korku ve strtok tarafından kullanılan yaklaşımlardır. Bir işaretçi veya dizin, örneğin bir işaretçi veya opak tip yerine, dahili olarak tutulan verilere döndürebilir. – Clifford

İlgili konular