2009-11-03 16 views

Odpowiedz

18

Istnieje kilka powodów do korzystania static w C.

W przypadku korzystania z funkcji, tak intencją jest do tworzenia abstrakcji. Pierwotnym określeniem zakresu pliku kodu źródłowego C była "jednostka tłumaczeniowa". Funkcje statyczne można uzyskać tylko z tej samej jednostki tłumaczeniowej. Te statyczne funkcje są podobne do prywatnych metod w C++, interpretowane liberalnie (analogicznie, jednostka tłumaczeniowa definiuje klasę).

Dane statyczne na poziomie globalnym są również niedostępne spoza jednostki tłumaczeniowej, a ta funkcja służy również do tworzenia abstrakcji. Dodatkowo, wszystkie dane statyczne są inicjowane do zera, więc do kontrolowania inicjalizacji można użyć static.

Statyczna na lokalnym ("automatycznym") poziomie zmiennym służy do wydzielenia implementacji funkcji, która utrzymuje stan przez wywołania, ale unika stosowania zmiennej w zakresie jednostki tłumaczeniowej. Ponownie, zmienne są inicjowane do zera ze względu na kwalifikację statyczną.

8

Słowo kluczowe static ma kilka zastosowań; Poza funkcją po prostu ogranicza widoczność funkcji lub zmiennej do jednostki kompilacji (plik .c), w której występuje funkcja lub zmienna. W ten sposób funkcja lub zmienna nie stają się globalne. To dobrze, promuje pewną zasadę "potrzeby poznania" (nie ujawniaj rzeczy, które nie muszą być narażone). Zmienne statyczne tego typu są inicjowane zerami, ale oczywiście zmienne globalne są również inicjowane zerowo, więc słowo kluczowe statyczne nie jest odpowiedzialne za zerową inicjalizację per se.

Zmienne można również zadeklarować statycznie w funkcji. Ta funkcja oznacza, że ​​zmienna nie jest automatyczna, tj. Przydzielana i zwalniana na stos przy każdym wywołaniu funkcji. Zamiast tego zmienna jest przydzielana w obszarze danych statycznych, jest inicjalizowana do zera i utrzymuje się przez cały czas trwania programu. Jeśli funkcja modyfikuje go podczas jednego wywołania, nowa zmodyfikowana wartość będzie dostępna przy następnym wywołaniu. To brzmi jak coś dobrego, ale istnieją powody, dla których "auto" jest domyślne, a "statyczne" zmienne w funkcjach powinny być używane oszczędnie. Krótko mówiąc, zmienne automatyczne są bardziej wydajne pod względem pamięci i są niezbędne, jeśli chcesz, aby twoja funkcja była bezpieczna dla wątków.

6

static jest używany zarówno jako storage class specifier, jak i linkage specifier. Jako specyfikator powiązań ogranicza zakres globalnej zmiennej lub funkcji do pojedynczej jednostki kompilacji. Pozwala to, na przykład, na kompilację mieć zmienne i funkcje o takich samych nazwach identyfikujących jak inne jednostki kompilacji, ale bez powodowania konfliktu, ponieważ takie identyfikatory są "ukryte" z linkera. Jest to przydatne, jeśli na przykład tworzysz bibliotekę i potrzebujesz wewnętrznych funkcji pomocniczych, które nie mogą powodować konfliktu z kodem użytkownika.

Jako specyfikator klasy pamięci zastosowany do zmiennej lokalnej, ma zupełnie inną semantykę, ale wydaje się, że twoje pytanie odnosi się do statycznego powiązania.

0

statyczne funkcje w C

W C, funkcje są globalne domyślnie. Słowo kluczowe "static" przed nazwą funkcji czyni ją statyczną. Na przykład poniżej funkcja fun() jest statyczna.

static int fun(void) 
{ 
    printf("I am a static function "); 
} 

W odróżnieniu od funkcji globalnych w C dostęp do funkcji statycznych jest ograniczony do pliku, w którym są zadeklarowane.Dlatego, gdy chcemy ograniczyć dostęp do funkcji, robimy je statyczne. Innym powodem tworzenia funkcji statycznych może być ponowne użycie tej samej nazwy funkcji w innych plikach.

Na przykład, jeśli przechowujemy następujący program w jednym pliku file1.c

/* Inside file1.c */ 
static void fun1(void) 
{ 
    puts("fun1 called"); 
} 

i przechowywać następujący program w innym pliku file2.c

/* Iinside file2.c */ 
int main(void) 
{ 
    fun1(); 
    getchar(); 
    return 0; 
} 

Teraz, jeśli skompilować powyższy kod za pomocą polecenia "gcc file2.c file1.c" otrzymujemy błąd "nieokreślone odniesienie do fun1’” . This is because fun1() is declared static` w file1.c i nie można go użyć w file2.c. Zobacz także explanation here, skąd pochodzą kody.

Powiązane problemy