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?
Respuesta
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.
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. –
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.
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.
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.
Su segundo punto es especialmente cierto al incorporar bibliotecas C, ya que carecen de espacios de nombres. –
@Robert - Sí, buen punto. –
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
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>
{
}
}
}
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.
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.
¿Por qué no agregar espacios de nombres no procesados a archivos .h? – Casebash
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).
- 1. ¿Debería cada clase tener su propio espacio de nombres?
- 2. Este objetivo puede incluir su propio producto
- 3. Escribiendo mi propio compilador C++
- 4. ¿Debo escribir mi propio software de foro?
- 5. escribir mi propio mapa su funcionamiento genérico
- 6. Debería poner mi definición de interfaz en el mismo espacio de nombres que su implementación
- 7. ¿Las enumeraciones en C# tienen su propio archivo?
- 8. ¿Debo crear cada clase en su propio archivo .py?
- 9. ¿Debo incluir bibliotecas C con mi aplicación Python?
- 10. ¿cómo puedo enumerar todo el espacio de nombres en XML?
- 11. ¿Por qué mi log en el espacio de nombres estándar?
- 12. C++ Espacio de nombres dolores de cabeza
- 13. Espacio de nombres enfrentadas en C++
- 14. C++ Espacio de nombres pregunta
- 15. Espacio de nombres Xml rompiendo mi xpath!
- 16. ¿Cómo escribir mi propio contenedor en C#?
- 17. Problema de espacio de nombres en C++
- 18. implementar su propio sizeof
- 19. ¿Qué debo incluir en mi archivo de cabecera para ostream
- 20. clojure - código de evaluación en el espacio de nombres diferente
- 21. ¿Debo optimizar mi código python como C++? ¿Importa?
- 22. Constante de espacio de nombres en C#
- 23. compilando su propio glibc
- 24. ¿Cómo incluir boost :: thread en su proyecto de C++?
- 25. ¿debo envolver todo mi código de servicio WCF en un bloque try catch?
- 26. ¿Debo incluir el complemento "sin prefijo" en mi sitio web
- 27. ¿Cómo ha usado IContainer/ISite/IComponent en su propio código?
- 28. Desarrollando mi propio CMS
- 29. Creando su propio idioma
- 30. ¿Debo usar @ en mi código PHP?
@Oliver: solo necesita 500 reputación para editar etiquetas. http://stackoverflow.com/faq –