Zmienne globalne (nie static
) są dostępne podczas tworzenia pliku .o
dostępnego dla łącznika w celu użycia go w innych plikach. Dlatego, jeśli masz dwa pliki, takie jak to, masz nazwy kolizji na a
:
AC:
#include <stdio.h>
int a;
int compute(void);
int main()
{
a = 1;
printf("%d %d\n", a, compute());
return 0;
}
bc:
int a;
int compute(void)
{
a = 0;
return a;
}
ponieważ łącznik nie wie, który z globalnym a
s używać.
Jednakże, gdy definiujesz statyczne globale, mówisz kompilatorowi, aby zachował zmienną tylko dla tego pliku i nie pozwól linkerowi o tym wiedzieć. Więc jeśli dodać static
(w definicji a
) do dwóch przykładowych kodów pisałem, nie dostaniesz kolizji nazw po prostu dlatego, że łącznik nie wie nawet, że jest a
w jednym z plików:
AC:
#include <stdio.h>
static int a;
int compute(void);
int main()
{
a = 1;
printf("%d %d\n", a, compute());
return 0;
}
bc:
static int a;
int compute(void)
{
a = 0;
return a;
}
oznacza to, że każdy plik działa z własnej a
nie wiedząc o pozostałych.
Na marginesie, to w porządku, że jeden z nich static
a drugi nie tak długo, jak są one w różnych plikach. Jeśli dwie deklaracje znajdują się w tym samym pliku (czytaj jednostka tłumaczeniowa), jedna static
i jedna extern
, patrz this answer.
Po przesłaniu kodu ... – Nawaz
Masz przykład? – glglgl
Jeśli obie zmienne są zadeklarowane jako statyczne w różnych plikach, nie powinno powodować kolizji nazw.Właśnie wykonałem szybki test i działa zgodnie z oczekiwaniami. Jeśli to nie działa, opublikuj kod, w którym nie działa on zgodnie z oczekiwaniami, czego się spodziewasz i co otrzymujesz oraz jakiego kompilatora używasz. – Kevin