Uwaga: to pytanie dotyczy name space
, a nie namespace
.
Standard C ++ zawiera kilka odniesień name space
, ale nie widzę jego definicji. Według standardów etykiety i makra znajdują się w różnych przestrzeniach nazw. Wszystkie pozostałe odniesienia name space
znajdują się w sekcji kompatybilności z C / C ++, takie jak ten ( aktualny projekt ):
Jest to jedna z niewielu niezgodności między C i C ++, którą można przypisać nowej definicji przestrzeni nazw C ++, w której nazwę można zadeklarować jako typ i jako nietyp w jednym zakresie, co powoduje, że nazwa nietypowa ukrywa nazwę wpisz nazwę i wymagając użycia słowa kluczowego klasa, struct, union lub enum w celu odniesienia do nazwy typu. Ta nowa definicja przestrzeni nazw zapewnia programistom C ++ ważne notacyjne ułatwienia i pomaga maksymalnie wykorzystać typy zdefiniowane przez użytkownika do podstawowych typów.
Czym jest ta nowa definicja przestrzeni nazw ? Gdzie mogę to znaleźć w standardzie? Jakie są dokładne zasady? Reguły wydają się bardziej skomplikowane niż „typy ukryte inne niż typy”. Na przykład to się nie kompiluje:
typedef int Foo; // Foo is a type
void Foo(); // not a type, but compile error, instead of hiding
Ale to powoduje:
struct Foo { }; // Foo is a type as well
void Foo(); // This hides the type Foo. "struct Foo" refers to the type
I to się nie kompiluje:
struct Foo { }; // Type
namespace Foo { } // Non-type, but compiler error instead of hiding
źródło
[stmt.label]/1
i jedna dla makr[cpp]/8
.Odpowiedzi:
Przestrzeni nazw termin ten może być jeszcze dobrze znane z normą ISO C; powołując się na ISO C11 :
Nowa definicja przestrzeni nazw C ++ jest jednak w żaden sposób nie ostatnim w czasie , i zostało opisane w [1] / diff.class w obecnej formie od czasu wprowadzenia ISO C ++ standardu w '98 . Jest on wymieniany tylko w dowolnej długości w kontekstach, dla których różni się od ISO C, zgodnie z [klasa różnicowa] / 1 cytowanym przez PO.
Afaics musimy odwołać się do ISO C11 / 6.2.3 i połączyć go z [klasą różnic] / 1 standardu ISO C ++, aby uzyskać spójny i pełny opis (nowej) definicji przestrzeni nazw C ++ , nie przejmując się ISO C ++ Standard dla np. [Basic.scope.hiding] , [class.name] / 2 , [stmt.label] / 1 , [cpp.replace] / 8 itd., Aby zobaczyć, jak i gdzie ma zastosowanie.
źródło
W C (6.2.3 Przestrzenie nazw identyfikatorów) pojęcie przestrzeni nazw definiuje się w następujący sposób.
Na przykład nazwa znacznika struktury może pokrywać się z nazwą funkcji, ponieważ należą one do różnych przestrzeni nazw. Gdy określisz strukturę o nazwie znacznika struktury, gdy będziesz musiał użyć słowa kluczowego
struct
. Na przykład te deklaracje nie powodują konfliktu.W tym fragmencie kodu nazwa znacznika
s
struktury nie powoduje konfliktu z nazwą funkcji,s
ponieważ nazwę znacznika należy podać słowem kluczowymstruct
.W C ++ możesz używać nazw znaczników struktury bez słowa kluczowego
struct
.Na przykład
jest poprawnym kodem. W tej deklaracji
nazwa deklarowanego identyfikatora
s
ukrywa nazwę struktury. SO, jeśli wtedy napiszesz na przykładwtedy kompilator wygeneruje błąd, ponieważ w tym stwierdzeniu s jest uważane za nazwę wyżej zadeklarowanego identyfikatora. Aby rozwiązać niejednoznaczność, musisz użyć słowa kluczowego struct
Jest to opisane w poniższym cytacie ze standardu C ++ 20 (6.3.1 Regiony i zakresy deklaratywne)
Jak widać z cytatu, nazwa przestrzeni nazw musi być unikalna w swoim deklaratywnym regionie. Więc te deklaracje
są nieprawidłowe.
źródło