2010-01-19 9 views
26

Lorsque vous utilisez un espace de noms anonyme, y a-t-il des problèmes s'il est imbriqué dans un autre espace de noms? Par exemple, est-il une réelle différence entre Foo1.cpp et Foo2.cpp dans le code suivant:Espace de noms anonyme imbriqué?

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

Les symboles exportés seront différents. Jetez un oeil à une sortie nm. –

+2

Juste pour être pédant, le terme technique est 'espace de nommage sans nom ', pas anonyme. – GManNickG

+0

Les unions sont anonymes, les espaces de noms ne sont pas nommés. Mais qui s'en soucie :) –

Répondre

26

espace de noms Anonymous pourrait être considéré comme un espace de noms normale avec nom unique que vous ne connaissez pas. Selon la norme C de 7.3.1.1:

Un sans nom-espace-définition se comporte comme si elle était remplacée par

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

où toutes les occurrences d'unique dans une unité de traduction sont remplacés par le même identifiant et cet identifiant diffère de tous les autres identifiants de l'ensemble du programme.

Il n'y a pas de problèmes supplémentaires.

3

Probablement pas de réelle différence pour vos besoins. Cela fait une différence à l'endroit où votre fichier cpp privateFunction est visible. Si vous ajoutez void barFunc() { privateFunction(); } à la fin des deux fichiers, alors Foo2.cpp se compile et Foo1.cpp ne le fait pas.

Normalement, vous ne définissez pas de symboles externes à partir d'un grand nombre d'espaces de noms différents dans le même fichier cpp, de sorte que la différence n'apparaît pas.