2010-08-30 25 views
23

Der Standard erlaubt es nicht, Code wie folgt:Gibt es einen bestimmten Grund, warum verschachtelte Namespace-Deklarationen in C++ nicht zulässig sind?

namespace Hello::World { 

//Things that are in namespace Hello::World 

} 

und erfordert stattdessen

namespace Hello { namespace World { 

//Things that are in namespace Hello::World 

}} 

Was die Begründung ist? Wurde zu dem Zeitpunkt einfach nicht daran gedacht, oder gibt es einen bestimmten Grund, warum es nicht enthalten ist?

Es scheint, dass die erste Syntax direkter ausdrückt, in welchem ​​Namespace einer sein soll, da die Deklaration die tatsächliche Verwendung des Namespace im späteren Code nachahmt. Es führt auch zu weniger Einrückung, wenn Sie unglücklicherweise ein "dummes" Klammerzählungs-Einrückwerkzeug verwenden.

+0

Mein einziger Gedanke auf diese Verwendung ist diese Art von ähnelt Erklärungen der Dinge innerhalb einer Klasse. Ich frage mich, ob es einige seltsame Ecken geben würde, einen Klassen-Namespace gegen einen Namespace-Namespace zu spezifizieren, der durch Ihre vorgeschlagene Syntax gebrochen würde. – Omnifarious

+0

möglich Duplikat von [Mehrere Namespace-Deklaration in C++] (http://stackoverflow.com/questions/3589204/multiple-namespace-declaration-in-c) – AnT

+10

@AndreyT: Ich frage nicht, ob es legal ist oder nicht, ich weiß, dass es illegal ist. Ich frage ** warum ** es ist illegal. –

Antwort

23

Der Grund ist wahrscheinlich "weil sich die Sprache so entwickelt hat."

Es gab mindestens einen Vorschlag ("Nested Namespace Definition Proposal" im Jahr 2003), geschachtelte Namensraumdefinitionen zuzulassen, aber er wurde nicht für die Aufnahme in C++ 0x ausgewählt.

+3

+1 für den Verweis auf den Vorschlag - das war mir nicht bewusst. –

+1

Nachdem ich diesen Vorschlag überprüft und etwas darüber nachgedacht habe, denke ich, dass Sie fast sicher Recht haben. Ich wette, es wurde nicht ausgewählt, nur weil der vorgeschlagene Vorteil nicht die Mühe wert war, einen Vorschlag durch den Standardisierungsprozess zu bekommen. – Omnifarious

+0

Ich akzeptiere die Antwort mit der höchsten Anzahl an Upvotes, weil ich die wahre Antwort hier offensichtlich nicht erraten kann. –

2

Wie ich in diesem „möglich Duplikat“ Thread gesagt, in C++ qualifizierten Namen sind für die Bezugnahme auf zuvor erklärten Einrichtungen vorbehalten. Dies gilt für beide "Quellen" von qualifizierten Namen: Klassen und Namespaces.

+0

"Exakt Duplizieren" bedeutet: "Diese Frage ist ein exaktes Duplikat einer anderen Frage", nicht "Es gibt eine Antwort, die für beide Fragen gilt." Aber +1 zu dieser Antwort. –

+4

Ich glaube nicht, dass dies ausreichend erklärt. Sie können den Namespace zuvor deklarieren, Sie können dieses Konstrukt jedoch immer noch nicht verwenden. –

+0

Also, sind Sie für den Vorschlag oder dagegen? Ich denke, Billy wollte, dass der Namespace vorher deklariert wurde ... – Potatoswatter

11

Ich nehme an, Sie würde lieber will es so, dass bei namespace X::Y, sein sollte, es zu „Namespace X äquivalent sein {Namensraum Y ', die auf der Oberfläche der feinen es klingt, aber eine Ecke Fall betrachten.

...
namespace Hello { 
    namespace { 
     namespace World {} 
    } 
} 

// Does this refer to an existing namespace? Or does it define a new one? 
namespace Hello::World {} 
+0

+1 für den Hinweis auf etwas, das ich nicht einmal wusste, war legal :) –

+6

Das wäre ein anderer Namensraum. 'Namespace Hello :: World {}' wäre nur eine Abkürzung für 'Namespace Hello {Namespace World {}}', was bereits von der Sprache erlaubt ist. –

+1

@James - Im Grunde gibt es keine Möglichkeit, anonyme Namespaces mit der verschachtelten Syntax zu referenzieren?Das erscheint mir vernünftig, da es wirklich keine Möglichkeit gibt, anders auf einen anonymen Namensraum zu verweisen. – Omnifarious

0

ich denke, es ist eine Design-Wahl war

die erste Syntax sieht gut aus und ich habe es auch haben wollen ist jedoch die zweite strukturierteren Sie nicht verschachtelte Namensräume auf diese Weise erstellen.:

Hello::World::Everyone::Great { 

} 

Werden Sie dies vorher erklären?

+1

Ja, ich hätte lieber mehr Klassifizierung von Softwarekomponenten. Sprachen wie Java und C# erlauben beide diese Art von Syntax und es funktioniert gut für sie.Beide enthalten auch extrem große Standardbibliotheken, und die Hierarchie, die verwendet wird, um Dinge in Namespaces zu klassifizieren, macht es viel einfacher, die gesuchte Komponente zu finden. –

12

Die geschachtelte Namespacedefinition ist Teil des C++ 17 Working Draft.
Dieses Thema wird in dem Vorschlag als ein Beispiel für dieses Feature erwähnt, das eine Programmierer-Anforderung ist Original n4026 aktualisierte Version: n4230.

Aktuelle neuesten Entwurf: n4567 (Ziffer 7.3.1 Artikel 10)

7.3.1 Namespace Definition
...
A nested-Namensraum-Definition mit einem umschließenden-Namensraum-Spezifikator E, Kennzeichner I und die Namensraum-Körper B entspricht namespace E { namespace I { B } }

Beispiel:

namespace A::B::C { 
    int i; 
} The above has the same effect as: 

namespace A { 
    namespace B { 
    namespace C { 
     int i; 
    } 
    } 
} 

Compiler Unterstützung

GCC seit aktivieren mit -std=c++1z
Visual C++ seit 2015 update 3 seit version 3.6 mit /std:c++latest
Clang ermöglichen ermöglichen -std=c++1z

Verwandte Themen