2010-01-19 28 views
26

Quando si utilizza uno spazio dei nomi anonimo ci sono problemi se è annidato in un altro spazio dei nomi? Ad esempio, v'è alcuna differenza reale tra Foo1.cpp e Foo2.cpp nel seguente codice:Spazio dei nomi anonimo nidificato?

// 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

I simboli esportati saranno diversi. Dai un'occhiata a un output nm. –

+2

Solo per essere pedante, il termine tecnico è 'namespace senza nome ', non anonimo. – GManNickG

+0

I sindacati sono anonimi, lo spazio dei nomi è senza nome. Ma a chi importa :) –

risposta

26

anonimo spazio dei nomi potrebbe essere considerato come uno spazio dei nomi normale con nome unico che non si conosce. Secondo C++ standard 7.3.1.1:

Un anonimo-namespace definizione si comporta come se fosse sostituito da

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

dove tutte le occorrenze di unico in un'unità di traduzione sono sostituiti dallo stesso identificativo e questo identificativo differisce da tutti gli altri identificatori nell'intero programma.

Non ci sono ulteriori problemi.

3

Probabilmente nessuna vera differenza per i vostri scopi. Fa la differenza su dove è visibile il file cpp privateFunction. Se aggiungi void barFunc() { privateFunction(); } alla fine di entrambi i file, Foo2.cpp viene compilato e Foo1.cpp no.

Normalmente non si definiscono simboli esterni da molti spazi dei nomi diversi nello stesso file cpp, quindi la differenza non verrà visualizzata.

Problemi correlati