Przestrzenie nazw
Kompilator konfiguruje "obszary nazw", aby rozróżniać identyfikatory używane dla różnych rodzajów elementów.Nazwy w obrębie każdego obszaru nazw muszą być unikatowe, aby uniknąć konfliktu, ale identyczne nazwy mogą pojawiać się w więcej niż jednym obszarze nazw.Oznacza to, że można użyć tego samego identyfikatora dla dwóch lub więcej dostarczonych, różnych elementów, pod warunkiem że elementy są w różnych obszarach nazw.Kompilator może rozpoznać odwołania na podstawie kontekstu składni identyfikatora w programie.
[!UWAGA]
Nie należy mylić ograniczonego pojęcia obszar nazw C z cechą "namespace" języka C++.Zobacz Obszary nazw w Informacje na temat języka C++, aby uzyskać więcej informacji.
Poniższa lista opisuje obszary nazw używane w C.
Instrukcja etykiety
Nazwane instrukcje etykiet są częścią instrukcji.Po definicjach instrukcji etykiet zawsze następuje dwukropek, ale nie są one częścią etykiet case.Użycia instrukcji etykiet zawsze znajdują się bezpośrednio po słowie kluczowym goto.Instrukcje etykiet nie muszą być różne od nazw innych lub nazw etykiet w innych funkcjach.Znaczniki struktury, zbioru i wyliczenia
Tagi te są częścią specyfikatorów typu struktury, zbioru i wyliczenia i, jeśli są obecne, zawsze po nich znajdują się słowa zarezerwowane struct, union lub enum.Nazwy tagów muszą być różne od innych tagów struktur, wyliczeń lub zbiorów o tej samej widoczności.Elementy członkowskie struktur lub zbiorów
Nazwy elementów członkowskich są przydzielane w przestrzeniach nazw skojarzonych z każdym typem struktury i zbioru.Oznacza to ten sam identyfikator może być nazwą składnika w dowolnej liczbie struktur lub zbiorów w tym samym czasie.Definicje nazw składników zawsze występują w ramach specyfikatora typu struktury lub zbioru.Użycia nazw składników zawsze znajdują się po operatorach wyboru elementów członkowskich (–> i .).Nazwa składnika musi być unikatowa w obrębie struktury lub zbioru, ale nie musi być odmienna od innych nazw w programie, łącznie z nazwami elementów członkowskich różnych struktur i zbiorów, lub nazw w samej strukturze.Zwykłe identyfikatory
Wszystkie inne nazwy dzielą się na obszar nazw, który zawiera zmienne, funkcje (w tym parametry formalne i zmienne lokalne) oraz stałe wyliczeń.Nazwy identyfikatorów mają zagnieżdżoną widoczność, więc można je zmienić w ramach bloku.Nazwy elementów typedef
Nazwy elementów typedef nie mogą być używane jako identyfikatory w tym samym zakresie.
Na przykład, ponieważ znaczniki struktury, elementy struktury i nazwy zmiennych są w trzech różnych obszarach nazw, trzy elementy o nazwie student w tym przykładzie nie będą w konflikcie.Kontekst każdego elementu pozwala na poprawną interpretację poszczególnych wystąpień student w programie. (Aby uzyskać informacje dotyczące struktur, zobacz Deklaracje struktur.)
struct student {
char student[20];
int class;
int id;
} student;
Gdy student pojawia się po słowie kluczowym struct, kompilator rozpoznaje je jako tag struktury.Gdy student pojawia się po operatorze wyboru elementu członkowskiego (–> lub .), nazwa odnosi się do elementu członkowskiego struktury.W innych kontekstach student odwołuje się do zmiennej struktury.Jednakże przeładowanie tagu obszaru nazw nie jest zalecane ponieważ ukrywane jest znaczenie.