Przestrzenie nazw

Kompilator konfiguruje „przestrzenie nazw”, aby rozróżniać identyfikatory używane dla różnych rodzajów elementów. Nazwy w obrębie każdego przestrzeni nazw muszą być unikatowe, aby uniknąć konfliktu, ale identyczne nazwy mogą pojawiać się w więcej niż jednej przestrzeni nazw. Oznacza to, że można użyć tego samego identyfikatora dla dwóch lub więcej różnych elementów, pod warunkiem że elementy znajdują się 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ą „przestrzeń nazw” języka C++. Aby uzyskać więcej informacji, zobacz Przestrzenie nazw w dokumentacji języka C++.

Poniższa lista opisuje przestrzenie nazw używane w C.

Etykiety instrukcji
Nazwane etykiety instrukcji są częścią instrukcji. Definicje etykiet instrukcji są zawsze po dwukropku, ale nie są częścią case etykiet. Użycie etykiet instrukcji zawsze natychmiast postępuje zgodnie ze słowem kluczowym goto. Etykiety instrukcji nie muszą być różne od innych nazw lub nazw etykiet w innych funkcjach.

Tagi struktury, unii i wyliczenia
Te tagi są częścią specyfikatorów typu struktury, unii i wyliczenia, a jeśli są obecne, zawsze należy natychmiast przestrzegać zastrzeżonych słów struct, unionlub enum. Nazwy tagów muszą być różne od innych tagów struktur, wyliczeń lub unii o tej samej widoczności.

Składowe struktur lub związków
Nazwy składowych są przydzielane w przestrzeniach nazw skojarzonych z każdą strukturą i typem unii. Oznacza to, że ten sam identyfikator może być nazwą składnika w dowolnej liczbie struktur lub unii w tym samym czasie. Definicje nazw składników zawsze występują w ramach specyfikatora typu struktury lub unii. Zastosowania nazw składników zawsze są natychmiast zgodne z operatorami wyboru składowych (-> i .). Nazwa składnika musi być unikatowa w obrębie struktury lub unii, ale nie musi być odmienna od innych nazw w programie, łącznie z nazwami elementów członkowskich różnych struktur i unii, lub nazw w samej strukturze.

Zwykłe identyfikatory
Wszystkie inne nazwy dzielą się na przestrzeń nazw, która zawiera zmienne, funkcje (w tym parametry formalne i zmienne lokalne) oraz stałe wyliczenia. Nazwy identyfikatorów mają zagnieżdżoną widoczność, więc można je zmienić w ramach bloku.

Nazwy definicji typów
Nazwy 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 o strukturach, zobacz Deklaracje struktury).

struct student {
   char student[20];
   int class;
   int id;
   } student;

Gdy student pojawia się po słowie struct kluczowym, kompilator rozpoznaje go jako tag struktury. Gdy student pojawia się po operatorze wyboru elementu członkowskiego (-> lub .), nazwa odnosi się do składowej struktury. W innych kontekstach student odwołuje się do zmiennej struktury. Jednakże przeładowanie tagu przestrzeni nazw nie jest zalecane, ponieważ następuje ukrycie znaczenia.

Zobacz też

Struktura programu