2011-07-22 8 views
13

może ktoś mi wyjaśnić różnicę pomiędzy następującymi zwyczajów Przestrzeń nazwCo wiodącą :: oznacza w "using namespace :: X" w C++

using namespace ::layer::module;

i

using namespace layer::module;

Co powoduje dodatkowe :: przed layer?

+2

To jest powtórka z http://stackoverflow.com/q/4925394/498253 – Tom

+0

@Tom: Ale czy to rzeczywiście dokładny dupek? – sbi

+1

@sbi: Tak, "co przed rozpoczęciem :: oznacza - i dlaczego jest używany?" ale ponieważ jest tu więcej odpowiedzi niż tam, nie mogę się zamknąć - po prostu pomyślałem, że link będzie pomocny – Tom

Odpowiedz

21

nie byłoby różnicy, jeśli został użyty w kontekście takich jak:

namespace layer { 
    namespace module { 
     int x; 
    } 
} 

namespace nest { 
    namespace layer { 
     namespace module { 
      int x; 
     } 
    } 
    using namespace /*::*/layer::module; 
} 

z początkowym :: pierwszy x byłby widoczny po stosując dyrektywy, przy drugim x wewnątrz nest::layer::module byłoby widoczny.

+0

+1 za fajną odpowiedź –

13

Drugi przypadek może być X::layer::module, gdzie już się zdarzyło using namespace X.

W pierwszym przypadku prefiks :: oznacza "kompilator, nie bądź sprytny, zacznij od globalnej przestrzeni nazw ".

11

Wiodący :: odnosi się do globalnej przestrzeni nazw. Każdy kwalifikowany identyfikator rozpoczynający się od :: będzie zawsze odnosił się do jakiegoś identyfikatora w globalnej przestrzeni nazw. Różnica jest, gdy masz ten sam materiał w globalnym, jak również w niektórych lokalnych nazw:

namespace layer { namespace module { 
    void f(); 
} } 

namespace blah { 
    namespace layer { namespace module { 
     void f(); 
    } } 

    using namespace layer::module // note: no leading :: 
           // refers to local namespace layer 
    void g() { 
    f(); // calls blah::layer::module::f(); 
    } 
} 

namespace blubb { 
    namespace layer { namespace module { 
     void f(); 
    } } 

    using namespace ::layer::module // note: leading :: 
            // refers to global namespace layer 
    void g() { 
    f(); // calls ::layer::module::f(); 
    } 
} 
3

Nazywa nazwa kwalifikowana jako odnośnika w C++.

Oznacza to, że obszar nazw warstw, do którego się odwołuje, to ten znajdujący się poza globalną przestrzenią nazw, a nie inna zagnieżdżona warstwa nazw.

Dla fanów Standerdese:
$ 3.4.3/1

„Nazwa członka klasy lub przestrzeni nazw można określić po :: zakres operatora rozdzielczości (5.1) nałożono na specyfikator-nazwy-zagnieżdżonej, który wyznacza swoją klasę lub przestrzeń nazw.Podczas wyszukiwania nazwy poprzedzającej operator :: scope scope, nazwy obiektów, funkcji i wyliczaczy są ignorowane, jeśli znaleziona nazwa nie jest nazwą klasy (klauzula 9) lub nazwa przestrzeni nazw (7.3.1), program jest źle sformułowany. "