Rozumiem, co robi statyczny, ale nie dlaczego go używamy. Czy chodzi tylko o utrzymywanie warstwy abstrakcji?Dlaczego zadeklarować zmienną lub funkcję statyczną w C?
Odpowiedz
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ą.
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.
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.
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.
- 1. C# zadeklarować zmienną do if
- 2. Jak uwolnić statyczną zmienną składową w C++?
- 3. jak zadeklarować globalną funkcję lub metodę za pomocą C#?
- 4. Dlaczego można zadeklarować zmienną bez wartości początkowej?
- 5. ASP.NET C# musi zadeklarować zmienną skalarną
- 6. Funkcja rekursywna ze zmienną statyczną
- 7. Jak mogę zadeklarować zmienną globalną w LLVM?
- 8. Jak zadeklarować zmienną globalną w VBA?
- 9. Potrzebuję utworzyć bezpieczną dla wątków zmienną statyczną w C# .Net
- 10. Dlaczego warto zadeklarować i zainicjować zmienną leksykalną w osobnych instrukcjach?
- 11. Jak zadeklarować zmienną "chronioną" w swift
- 12. Kiedy zadeklarować nową (anonimową) funkcję w javascript?
- 13. Czy mogę zadeklarować zmienną w html?
- 14. Czy lepiej jest zadeklarować zmienną wewnątrz lub na zewnątrz pętli?
- 15. jak zadeklarować zmienną NSString z podwójnym wskaźnikiem
- 16. Gdzie powinienem zadeklarować zmienną sesji w asp.net
- 17. Jak zadeklarować stałą zmienną w skrypcie powłoki?
- 18. Jak zadeklarować zmienną globalną w php?
- 19. PHP - czy można zadeklarować metodę statyczną i niestatyczną?
- 20. Jak utworzyć zmienną statyczną wątek bezpieczny
- 21. C++ zainicjować macierz statyczną
- 22. Dlaczego nie mogę zainicjować zmiennej statycznej, wywołując funkcję statyczną w Swift?
- 23. Kotlin: Jak utworzyć "statyczną" dziedziczną funkcję?
- 24. Jak zadeklarować zmienną niestandardową wewnątrz celu make?
- 25. PHP: zadeklarować zmienną klasy jako obiekt stdClass
- 26. Jak zadeklarować zmienną globalną z klasy?
- 27. Jak zadeklarować zmienną typu List <string> w typeScript?
- 28. Jaka jest różnica między stałą statyczną a zmienną constexpr?
- 29. Jak zadeklarować zmienną, która może zawierać tylko klasy wyliczeniowe?
- 30. "C" sizeof z typem lub zmienną
Powielanie http://stackoverflow.com/questions/572547/what-does-static-mean-in-a-c-program –