¿Cuándo se usaría el espacio de nombres sin nombre en C++? ¿Es mejor en algún sentido que una función independiente? Además, ¿debería usarse solo en el archivo fuente y no en el archivo de encabezado?Usos del espacio de nombres sin nombre en C++
Respuesta
De acuerdo con Stroustrup, deberías usarlo en lugares donde en la antigua C hubieras fabricado static
globales. La idea es que los elementos en cuestión puedan ser "globales" para el archivo fuente en el que se encuentran, pero no contaminen el espacio de nombres de cualquier otro archivo fuente en su compilación.
En otras palabras, no debería crear static
globales en C++. Debería usar espacios de nombres sin nombre en su lugar.
He encontrado algunas situaciones en las que son útiles en archivos de encabezado, pero eso debería ser raro. Sobre todo, creo por declarar excepciones descartables. En ese caso, las definiciones en cuestión serán globales para todo lo que #include
s ese encabezado, pero no para las cosas que no lo hacen.
'static' ya no está marcado como desaprobado en el último número del FCD (n3225). El comité reconoció que es menos detallado para una sola función o global. También es más fácil "grep", ya que aparece cerca de la declaración y no requiere un analizador. –
@Matthieu: pero luego las funciones tienen un enlace interno. La verdadera razón por la que los espacios de nombres sin nombre se llaman "superiores" es que "ocultan" el símbolo en lugar de cambiar el enlace del objeto/función, que es una coincidencia más cercana a lo que las personas generalmente quieren lograr cuando lo usan. Eso no ha cambiado en C++ 0x, han reconocido que (1) si teme que el enlace externo sea costoso, entonces quiere un enlace interno, lo que a su vez significa que quiere 'estático', y (2) 'Nunca vamos a eliminar 'static' en este contexto debido a la compatibilidad con C, por lo que desaprobarlo es una amenaza vacía. –
@Steve: esperaba que también cambiara el enlace, ¿cuál es el objetivo de mantenerlo externo si nadie conoce el símbolo? –
Se usa para esconder nombres. Cada espacio de nombre sin nombre es único. El enlace here explica con más detalle. Normalmente se usa en un archivo fuente para ocultar funciones que solo deberían tener un enlace interno (por ejemplo, no expuesto al mundo exterior).
El espacio de nombres sin nombre es privado para la unidad de traducción y puede utilizarse para proteger variables globales y funciones con los mismos nombres en diferentes unidades de traducción para que no surjan conflictos de enlace.
Por ejemplo, necesita una clase que solo se definirá en un archivo .cpp y se usará solo dentro de ese archivo. Desea llamarlo CModuleLock
. Si no está en un espacio de nombres sin nombre y algún otro archivo .cpp tiene otra clase CModuleLock
que no está en un espacio de nombre sin nombre, no podrá vincular su programa.
A veces uso espacios de nombre sin nombre para clases que pueden ser de clase privada interna, pero me gustaría compartir entre clases similares (quizás aquellos implementando el mismo concepto). Por supuesto, si la clase se vuelve lo suficientemente general, la moveré a un espacio de nombre con nombre. – RichardBruce
Los espacios de nombres sin nombre son la "versión de C++" de variables y funciones estáticas globales. Tenga en cuenta que también puede usar un espacio de nombres sin nombre para las clases.
Básicamente, espacio de nombres a resolver los conflictos entre las clases del mismo nombre, identificadores, y function.For más información haga clic en el enlace a continuación https://simplifiedtutorial4u.blogspot.in/2017/08/what-is-namespace-in-c.html
- 1. :: sin espacio de nombres
- 2. Métodos dentro del espacio de nombres C#
- 3. el nombre del tipo o el nombre del espacio de nombres no existe en el espacio de nombres
- 4. C++ Espacio de nombres pregunta
- 5. ¿Cómo conseguir un espacio de nombres sin un nombre?
- 6. SelectSingleNode sin espacio de nombres
- 7. Constante de espacio de nombres en C#
- 8. Problema de espacio de nombres en C++
- 9. C funciones de devolución de llamada definidas en un espacio de nombre sin nombre?
- 10. Clojure: haciendo referencia al nombre del espacio de nombres
- 11. Vinculación de símbolos dentro del espacio de nombres anónimo dentro de un espacio de nombre normal
- 12. C++ Espacio de nombres dolores de cabeza
- 13. Obtener el espacio de nombres del archivo xml C#
- 14. El tipo o el nombre del espacio de nombres 'Objetos' no existe en el espacio de nombres 'System.Data'
- 15. El tipo o el nombre del espacio de nombres 'Mvc' no existe en el espacio de nombres 'System.Web'
- 16. convención de codificación del espacio de nombres raíz en C++
- 17. Espacio de nombres enfrentadas en C++
- 18. El tipo o el nombre del espacio de nombres 'ServiceBus' no existe en el espacio de nombres 'Microsoft'
- 19. ¿El tipo o el nombre del espacio de nombres 'DirectoryServices' no existe en el espacio de nombres?
- 20. El tipo o el nombre del espacio de nombres UpdatePanel no existe en el espacio de nombres System.Web.UI
- 21. Orden de búsqueda del espacio de nombres
- 22. Acceso al espacio de nombres global C++ desde otro espacio de nombre
- 23. El tipo o el nombre del espacio de nombres 'Linq' no existe en el espacio de nombres 'Sistema'
- 24. El tipo o el nombre del espacio de nombres 'Linq' no existe en el espacio de nombres 'System.Data'
- 25. Sparql Query Results sin espacio de nombres
- 26. reglas de nomenclatura y uso del espacio de nombres C++
- 27. ¿Usar el espacio de nombres causa ocultar el nombre?
- 28. Buscar XDocument utilizando LINQ sin conocer el espacio de nombres
- 29. espacios de nombres sin nombre de la jerarquización
- 30. Nombre calificado en la declaración de espacio de nombres
Vea este tema también: [? Superioridad del espacio de nombres sin nombre sobre estática] (http://stackoverflow.com/questions/4422507/superiority-of-unnamed-namespace-over-static) – Nawaz