2008-11-25 7 views
17

ich auf einige Code arbeite von einem Mitarbeiter geschrieben, die nicht mehr mit dem Unternehmen arbeitet, und ich habe den folgenden Code gefunden: (welche ich unten geschnitten)C++ Namespace Frage

namespace NsA { namespace NsB { namespace NsC { 

    namespace { 
     class A { /*etc*/ }; 
     class B { /*etc*/ }; 
    }  

    namespace { 
     class C { /*etc*/ }; 
    } 
} } } 

I verstehe nicht den Zweck der Namespace-Befehle in den Zeilen 3 und 8.
Kann jemand erklären, was der Zweck eines Namespace-Eintrags ohne Namen ist?

Antwort

36

Das ist ein "anonymer Namespace" - der einen versteckten Namespace-Namen erstellt, der eindeutig pro "Übersetzungseinheit" ist (d. H. Pro CPP-Datei).

Dies bedeutet effektiv, dass alle Elemente in diesem Namespace von außerhalb dieser Kompilierungseinheit ausgeblendet sind. Sie können nur in derselben Datei verwendet werden. Siehe auch this article für unbenannte Namespaces.

+0

Interessant. Ich wusste nicht, dass du das tun kannst. Ich muss es mir merken. – Herms

+0

Es macht auch die Notwendigkeit von "statischen" Variablen obsolet (Sichtbarkeit der Kompilierungseinheit) – xtofl

+1

statische ist immer noch gelegentlich nützlich. Dadurch werden die Namen nicht extern verknüpft, während anonyme Namespaces den Namen der Verknüpfungen ändern. –