W C zmienne mogą mieć różne zakresy widoczności: lokalny (wewnątrz bloku), globalny (w całym pliku) oraz zakres widoczności w obrębie pliku (static). Prawidłowe zarządzanie zakresami widoczności jest ważne dla przewidywalności działania i zapobiegania konfliktom nazw.
Są widoczne we wszystkich funkcjach pliku, a jeśli są zadeklarowane z extern – w całym projekcie.
Tworzone są przy wejściu do bloku (np. funkcji lub pętli). Nie są widoczne poza blokiem deklaracji.
static int foo; – tylko dla bieżącego pliku.
Przykład:
static int counter = 0; // Tylko wewnątrz pliku void increment() { int temp = 10; // zmienna lokalna ++counter; }
Jeśli zmienne globalne i lokalne mają tę samą nazwę, która z nich jest używana wewnątrz funkcji i dlaczego?
Odpowiedź: Używana jest lokalna, ponieważ "zacienia" (shadowing) globalną nazwę w swojej przestrzeni widoczności. Zmienna globalna pozostaje dostępna poza blokiem deklaracji zmiennej lokalnej.
Przykład:
int value = 5; void foo() { int value = 10; printf("%d", value); // wyświetli 10, a nie 5 }
Historia
Historia
static dla funkcji pomocniczej i zmiennej, co doprowadziło do konfliktów nazw podczas linkowania, a także do nieprzewidywalnych błędów przy kompilacji różnych części projektu.Historia
Zdarzały się przypadki, gdy globalne zmienne były używane w kodzie wielowątkowym bez odpowiedniej synchronizacji. Z powodu niejawnego zakresu widoczności i nieuwagi przy zmianie wartości w różnych wątkach występowały wyścigi danych (data race).