2010-01-19 31 views
26

Podczas korzystania z anonimowego obszaru nazw są jakieś problemy, jeśli są zagnieżdżone w innym obszarze nazw? Na przykład, czy istnieje prawdziwa różnica pomiędzy Foo1.cpp i Foo2.cpp w poniższym kodzie:Zagnieżdżona anonimowa przestrzeń nazw?

// Foo.h 
namespace Foo 
{ 
    void fooFunc(); 
} 

// Foo1.cpp 
namespace Foo 
{ 
    namespace 
    { 
     void privateFunction() 
     { 
      ... 
     } 
    } 

    void fooFunc() 
    { 
     privateFunction(); 
    } 
} 

// Foo2.cpp 
namespace 
{ 
    void privateFunction() 
    { 
     ... 
    } 
} 

namespace Foo 
{ 
    void fooFunc() 
    { 
     privateFunction(); 
    } 
} 
+0

Wyeksportowane symbole będą różne. Zobacz wyjście nm. –

+2

Po prostu pedantyczny, termin techniczny to "bezimienny obszar nazw", a nie anonimowy. – GManNickG

+0

Związki są anonimowe, przestrzeń nazw nie ma nazwy. Ale kogo to obchodzi :) –

Odpowiedz

26

nazw Anonymous można uznać za normalny nazw z unikalnej nazwy, których nie znamy. Według standardu C++ 7.3.1.1:

Anonimowy-nazw-definition zachowuje się tak, jakby zostały zastąpione przez

namespace unique { /* empty body */ } 
    using namespace unique; 
    namespace unique { namespace-body } 

gdzie wszystkie wystąpienia unikatowe w jednostce tłumaczenia są zastępowane przez tego samego identyfikatora i ten identyfikator różni się od wszystkich innych identyfikatorów w całym programie.

Nie ma żadnych dodatkowych problemów.

3

Prawdopodobnie nie ma żadnej różnicy dla twoich celów. Ma to wpływ na to, gdzie w pliku cpp privateFunction jest widoczny. Jeśli dodasz void barFunc() { privateFunction(); } na końcu obu plików, kompiluje się Foo2.cpp, a Foo1.cpp nie.

Normalnie nie definiowałbyś zewnętrznych symboli z wielu różnych przestrzeni nazw w tym samym pliku cpp, więc różnica nie pojawi się.