Pregunta ¿Espacio de nombres anónimo anidado?


Al usar un espacio de nombres 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?

// 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();
    }
}

28
2018-01-19 14:19


origen


Respuestas:


El espacio de nombre anónimo podría considerarse como un espacio de nombre normal con un nombre único que no conoce. De acuerdo con el estándar C ++ 7.3.1.1:

Una definición de espacio de nombres sin nombre se comporta como si fuera reemplazada por

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

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

No hay problemas adicionales


27
2018-01-19 14:43



Probablemente no haya una diferencia real para tus propósitos. Hace una diferencia a dónde en su archivo cpp privateFunction es visible. Si agrega void barFunc() { privateFunction(); } al final de ambos archivos, entonces Foo2.cpp compila y Foo1.cpp no.

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


3
2018-01-19 14:44