2011-11-21 12 views
59

¿Hay alguna diferencia entre envolver los contenidos del encabezado y del archivo cpp en un espacio de nombre o ajustar solo el contenido del encabezado y luego hacer usando el espacio de nombres en el archivo cpp?Creación de un espacio de nombres C++ en el encabezado y fuente (cpp)

Por diferencia quiero decir cualquier tipo de penalización de rendimiento o semántica ligeramente diferente que pueda causar problemas o cualquier cosa que deba tener en cuenta.

Ejemplo:

// header 
namespace X 
{ 
    class Foo 
    { 
    public: 
    void TheFunc(); 
    }; 
} 

// cpp 
namespace X 
{ 
    void Foo::TheFunc() 
    { 
    return; 
    } 
} 

VS

// header 
namespace X 
{ 
    class Foo 
    { 
    public: 
    void TheFunc(); 
    }; 
} 

// cpp 
using namespace X; 
{ 
    void Foo::TheFunc() 
    { 
    return; 
    } 
} 

Si no hay ninguna diferencia lo que es la forma preferida y por qué?

Respuesta

28

El espacio de nombre es solo una forma de modificar la firma de la función para que no entren en conflicto. Algunos prefieren la primera manera y otros prefieren la segunda versión. Ambas versiones no tienen ningún efecto en el rendimiento del tiempo de compilación. Tenga en cuenta que los espacios de nombres son solo una entidad de tiempo de compilación.

El único problema que surge con el uso del espacio de nombres es cuando tenemos los mismos nombres de espacio de nombres anidados (es decir) X::X::Foo. Hacer eso crea más confusión con o sin usar palabra clave.

34

La diferencia entre "namespace X" y "using namespace X" está en la primera de todas las nuevas declaraciones estará bajo el espacio de nombres, mientras que en la segunda no.

En su ejemplo, no hay una nueva declaración, por lo que no hay diferencia, por lo tanto, no hay una forma preferida.

+0

Depende del proyecto y el estilo. A menudo hay un espacio de nombres principal para una carga de archivos en un módulo, y el segundo estilo tiene sentido. –

1

Si el segundo se compila también, no debería haber diferencias. Los espacios de nombres se procesan en tiempo de compilación y no deben afectar las acciones de tiempo de ejecución.

Pero por cuestiones de diseño, el segundo es horrible. Incluso si se compila (no estoy seguro), no tiene ningún sentido.

+1

No creo que se compile, pero no porque exista una diferencia, sino porque hay un '' '' '-) difuso –

+0

La diferencia es Foo :: TheFunc() se declara en el espacio de nombres global, mientras que se define en el espacio de nombres X. –

1

Foo :: TheFunc() no está en el espacio de nombres correcto en VS-case. Use 'void X :: Foo :: TheFunc() {}' para implementar la función en el espacio de nombre correcto (X).

+0

La pregunta es un poco antigua, pero ¿sabes cuáles son las consecuencias de esto? es decir¿se encontrará con algún problema con la forma en que su caso VS declara las funciones en el espacio de nombres, pero las define fuera de él? –

5

No hay penalizaciones en el rendimiento, ya que el resultado podría ser el mismo, pero poner su Foo en el espacio de nombres introduce implícitamente ambigüedad en caso de que tenga Foo s en diferentes espacios de nombres. Puede obtener su código fubar, de hecho. Recomiendo evitar el uso de using para este propósito.

Y usted tiene un perro callejero { después using namespace ;-)

+0

No lo llamaría extraviada, ya que coincide con el cierre '}' al final. Sin embargo, llamaría redundante a ese par de llaves;) – blubberdiblub

+0

@blubberdiblub, la pregunta fue editada; si revisó la versión original, * la llamaría "extraviada" ;-) –

0

En caso si usted envuelve sólo el contenido .h que tiene que escribir usando espacio de nombres ... en cpp de lo contrario cada vez que trabaja en la válida espacio de nombres Normalmente, envuelve ambos archivos .cpp y .h; de lo contrario, corre el riesgo de utilizar objetos de otro espacio de nombres que pueden generar muchos problemas.

Cuestiones relacionadas