Aby odpowiedzieć na pytanie, „czy statyczny oznacza, że tworzona jest tylko jedna kopia VAL, w przypadku gdy nagłówek jest zawarty w więcej niż jednym pliku źródłowym?” ...
NIE . VAL będzie zawsze definiowane oddzielnie w każdym pliku zawierającym nagłówek.
Standardy C i C ++ powodują różnicę w tym przypadku.
W języku C zmienne o zasięgu pliku są domyślnie extern. Jeśli używasz C, VAL jest statyczne, a ANOTHER_VAL to zewnętrzne.
Zauważ, że nowoczesne konsolidatory mogą narzekać na ANOTHER_VAL, jeśli nagłówek jest zawarty w różnych plikach (ta sama nazwa globalna zdefiniowana dwukrotnie) i na pewno skarżyliby się, gdyby ANOTHER_VAL został zainicjowany inną wartością w innym pliku
W języku C ++ zmienne o zasięgu pliku są domyślnie statyczne, jeśli są stałymi, i domyślnie extern, jeśli nie są. Jeśli używasz C ++, zarówno VAL, jak i ANOTHER_VAL są statyczne.
Musisz również wziąć pod uwagę fakt, że obie zmienne są oznaczone jako const. Idealnie byłoby, gdyby kompilator zawsze wybierał wstawianie tych zmiennych i nie zawierał dla nich pamięci. Istnieje wiele powodów, dla których można przydzielić pamięć. Te, które przychodzą mi do głowy ...
- opcje debugowania
- adres wzięty w pliku
- kompilator zawsze przydziela pamięć (złożone typy const nie mogą być łatwo wstawiane, więc staje się specjalnym przypadkiem dla typów podstawowych)