2010-01-19 37 views
26

Al usar un espacio de nombre anónimo, ¿hay algún problema si está anidado dentro de otro espacio de nombres? Por ejemplo, ¿hay alguna diferencia real entre Foo1.cpp y Foo2.cpp en el siguiente código:Espacio de nombres anónimo anidado?

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

Los símbolos exportados serán diferentes. Echa un vistazo a la salida nm. –

+2

Para ser pedante, el término técnico es 'namespace' sin nombre, no anónimo. – GManNickG

+0

Las uniones son anónimas, el espacio de nombres no tiene nombre. Pero a quién le importa :) –

Respuesta

26

Anónimo espacio de nombres podría ser considerado como un espacio de nombres normal con nombre único que no sabe. Según C++ estándar 7.3.1.1:

Un espacio de nombres-definición no identificado se comporta como si fuera reemplazado por

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

donde todas las apariciones de único en una unidad de traducción se sustituyen por el mismo identificador y este identificador difiere de todos los demás identificadores en todo el programa.

No hay problemas adicionales.

3

Probablemente no haya una diferencia real para sus propósitos. Marca la diferencia de dónde está visible en su archivo cpp privateFunction. Si agrega void barFunc() { privateFunction(); } al final de ambos archivos, entonces Foo2.cpp compila y Foo1.cpp no ​​lo hace.

Normalmente no definiría los símbolos externos de muchos espacios de nombres diferentes en el mismo archivo cpp, por lo que la diferencia no aparecerá.

Cuestiones relacionadas