2009-02-02 14 views
25

Vengo de un fondo C# donde todo tiene su propio espacio de nombres, pero esta práctica parece ser poco común en el mundo C++. ¿Debo incluir mi código en su propio espacio de nombres, el espacio de nombres sin nombre o el espacio de nombres?¿Debo incluir todo mi código C++ en su propio espacio de nombres?

+0

@Oliver: solo necesita 500 reputación para editar etiquetas. http://stackoverflow.com/faq –

Respuesta

35

Muchos desarrolladores de C++ no usan espacios de nombres, por desgracia. Cuando comencé con C++, no los usé durante mucho tiempo, hasta que llegué a la conclusión de que puedo hacerlo mejor usando espacios de nombres.

Muchas bibliotecas trabajan alrededor de los espacios de nombres colocando prefijos antes de los nombres. Por ejemplo, wxWidgets pone los caracteres "wx" antes que todo. Qt pone "Q" antes de todo. No hay nada realmente malo en eso, pero requiere que escribas ese prefijo de nuevo, aunque puede deducirse del contexto al que te refieres con las declaraciones. Los espacios de nombres tienen un orden jerárquico. Los nombres que están léxicamente más cercanos al punto que los referencia se encuentran más temprano. Entonces, si hace referencia a "Ventana" dentro de su marco de GUI, encontrará "my :: gui :: Window", en lugar de ":: Window".

Los espacios de nombres habilitan algunas características agradables que no se pueden usar sin ellos. Por ejemplo, si coloca su clase en un espacio de nombres, puede definir funciones gratuitas dentro de ese espacio de nombres. A continuación, llama a llamar a la función sin incluir el espacio de nombres importando todos los nombres, o selectivamente solo algunos de ellos en el ámbito actual ("using declaration").

Hoy en día, ya no hago ningún proyecto sin usarlos. Hacen que sea tan fácil no volver a escribir el mismo prefijo, pero aún así tener una buena organización y evitar la contaminación del nombre del espacio de nombres global.

+5

Sí, y hace que el código MUCHO más claro. Una variable global no te dice nada, pero config :: max_threads al menos te da una pista sobre de dónde viene. –

1

Solo necesita espacios de nombres si existe el riesgo de conflicto de nombres: alguna función vista a nivel mundial o variable o clase se define más de una vez. De lo contrario, te irá bien sin espacio de nombre, solo nombra tus clases para que no dupliquen las clases de la biblioteca de tiempo de ejecución y para que las funciones/variables globales sean miembros estáticos de algunas clases razonables.

11

Depende, si su código es código de biblioteca, envuélvalo en espacios de nombres, esa es la práctica en C++. Si su código es solo una aplicación muy simple que no interactúa con ninguna otra cosa, como un tipo de aplicación Hello World, no hay necesidad de espacios de nombres, porque es redundante.

Y como los espacios de nombres no son necesarios, los fragmentos de código y los ejemplos en la web raramente los utilizan, pero la mayoría de los proyectos reales sí los usan.

2

Realmente depende de si espera que haya algún conflicto.

Dos escenarios;

1) Si está creando código que otros pueden usar (por ejemplo, bibliotecas), podría haber conflictos de espacios de nombres, por lo que usar su propio espacio de nombres es una buena idea.

2) Si está utilizando bibliotecas de terceros, es posible que su código no esté en el espacio de nombres y pueda entrar en conflicto con el suyo.

También diría que si espera que su código sea considerable y abarque muchas áreas diferentes (matemática/física/renderización), el uso de espacios de nombres hace que el código sea más fácil de asimilar, particularmente para los tipos que obviamente no están clasificados.

+0

Su segundo punto es especialmente cierto al incorporar bibliotecas C, ya que carecen de espacios de nombres. –

+0

@Robert - Sí, buen punto. –

+2

Nada "especialmente cierto" para las bibliotecas C aquí. Las bibliotecas Good C se namespaced a través de prefijos. Las bibliotecas buenas de С ++ tienen espacios de nombres a través de espacios de nombres. Las bibliotecas de Bad C y C++ no tienen espacio de nombres. Es una cuestión de calidad, no de lenguaje. – Constantin

1

pero esta práctica parece ser poco común en el mundo C++

realmente. Todo el código que veo parece estar envuelto en un espacio de nombres.
Uso el mismo tipo de convención que veo en Java (excepto que omito el com).

En Java

package com.<Company>.<Product>.<Package>; 

En C++

namespace <Company> 
{ 
    namespace <Product> 
    { 
     namespace <Package> 
     { 
     } 
    } 
} 
2

Tuvimos problemas que envuelven código en C++ administrado que utiliza nuestras bibliotecas comunes aquí.

Algunas clases tienen los mismos nombres que la clase System en la biblioteca .NET (es decir, System.Console).
Tuvimos que hacer algunos macro parches feos para solucionar estos problemas.

El uso de espacios de nombres al principio hubiera impedido esto.

3

acabo de descubrir C++ guía de estilo de Google y tienen namespace guidelines.

Toda la guía vale la pena leer, pero para resumir, que dicen:

  • Agregar espacios de nombres sin nombre a .cc archivos, pero no. h archivos.
  • Ajustar todo (después de incluye/declaraciones) archivos .cc y .h en espacios de nombres con nombre.
  • Los espacios de nombre no incrementan el nivel de sangría.
  • En la llave de cierre para un espacio de nombres escriba } // namespace.
  • No declare nada en std, porque no está definido.
  • usando la directiva using está prohibido.
  • se permite la declaración using en funciones, métodos y clases.
  • alias de nombres de espacios están permitidos en cualquier lugar.
+0

¿Por qué no agregar espacios de nombres no procesados ​​a archivos .h? – Casebash

1

Yo diría que es una buena idea, aunque solo sea para evitar que sus cosas se interrumpan cuando se mezclan con otros códigos de terceros.

Intento ir incluso más allá al poner tantas variables y funciones como puedo en las clases. Pero a veces eso es más difícil de lo que debería (en comparación con otros lenguajes de OO).

Cuestiones relacionadas