Hinweis: Bei dieser Frage geht es name space
nicht um namespace
.
Der C ++ - Standard enthält einige Verweise auf name space
, aber ich sehe die Definition dafür nicht. Die Standards besagen, dass sich Beschriftungen und Makros in unterschiedlichen Namensräumen befinden. Alle anderen Verweise auf name space
befinden sich im Abschnitt zur C / C ++ - Kompatibilität wie folgt ( aktueller Entwurf ):
Dies ist eine der wenigen Inkompatibilitäten zwischen C und C ++, die der neuen C ++ - Namensraumdefinition zugeordnet werden können, bei der ein Name als Typ und als Nicht-Typ in einem einzelnen Bereich deklariert werden kann, wodurch der Nicht-Typ-Name den Namen verbirgt Typname und erfordert, dass die Schlüsselwörter class, struct, union oder enum verwendet werden, um auf den Typnamen zu verweisen. Diese neue Namensraumdefinition bietet C ++ - Programmierern wichtige Notationskomfort und hilft dabei, die Verwendung der benutzerdefinierten Typen der Verwendung grundlegender Typen so ähnlich wie möglich zu machen.
Was ist diese neue Namensraumdefinition ? Wo finde ich es im Standard? Was sind die genauen Regeln? Die Regeln scheinen komplizierter zu sein als "Nicht-Typen verstecken Typen". Das wird nicht kompiliert:
typedef int Foo; // Foo is a type
void Foo(); // not a type, but compile error, instead of hiding
Aber das tut:
struct Foo { }; // Foo is a type as well
void Foo(); // This hides the type Foo. "struct Foo" refers to the type
Und das kompiliert auch nicht:
struct Foo { }; // Type
namespace Foo { } // Non-type, but compiler error instead of hiding
quelle
[stmt.label]/1
und einen für Makros[cpp]/8
.Antworten:
Der Begriff des Namensraums ist möglicherweise in der ISO C-Norm besser verankert. unter Berufung auf ISO C11 :
Die neue Namensraumdefinition von C ++ ist jedoch in keiner Weise neu in der Zeit und wurde in [diff.class] / 1 in ihrer aktuellen Form seit der Einführung des ISO C ++ - Standards im Jahr '98 beschrieben . Es wird immer nur in irgendeiner Länge in den Kontexten erwähnt, für die es sich von ISO C unterscheidet, gemäß [diff.class] / 1, das vom OP zitiert wird.
Afaics müssen wir auf ISO C11 / 6.2.3 zurückgreifen und es mit [diff.class] / 1 des ISO C ++ - Standards kombinieren, um eine zusammenhängende und vollständige Beschreibung der (neuen) Namensraumdefinition von C ++ zu erhalten , ohne die ISO zu geißeln C ++ Standard für z. B. [basic.scope.hiding] , [class.name] / 2 , [stmt.label] / 1 , [cpp.replace] / 8 usw., um zu sehen, wie und wo es gilt.
quelle
In C (6.2.3 Namensräume von Bezeichnern) wird der Begriff der Namensräume folgendermaßen definiert.
So kann beispielsweise ein Struktur-Tag-Name mit einem Funktionsnamen übereinstimmen, da sie zu verschiedenen Namensräumen gehören. Wenn Sie eine Struktur mit einem Struktur-Tag-Namen angeben, wenn Sie das Schlüsselwort verwenden müssen
struct
. So stehen diese Erklärungen beispielsweise nicht in Konflikt.In diesem Codeausschnitt steht der Tag-Name
s
der Struktur nicht in Konflikt mit dem Funktionsnamen,s
da der Tag-Name mit dem Schlüsselwort angegeben werden sollstruct
.In C ++ dürfen Sie Struktur-Tag-Namen ohne das Schlüsselwort verwenden
struct
.Zum Beispiel
ist ein korrekter Code. In dieser Erklärung
Der Name des deklarierten Bezeichners
s
verbirgt den Strukturnamen. Also wenn dann schreibst du zum Beispieldann gibt der Compiler einen Fehler aus, da in dieser Anweisung s als Name des oben deklarierten Bezeichners betrachtet wird. Um die Mehrdeutigkeit aufzulösen, müssen Sie das Schlüsselwort struct verwenden
Dies wird im folgenden Zitat aus dem C ++ 20-Standard (6.3.1 Deklarative Regionen und Bereiche) beschrieben.
Wie Sie dem Zitat entnehmen können, muss ein Namespace-Name in seiner deklarativen Region eindeutig sein. Also diese Erklärungen
sind falsch.
quelle