2011-03-15 24 views
63

¿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++

+2

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

Respuesta

57

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.

+2

'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. –

+6

@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. –

+2

@Steve: esperaba que también cambiara el enlace, ¿cuál es el objetivo de mantenerlo externo si nadie conoce el símbolo? –

8

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).

25

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.

+0

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

1

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.

Cuestiones relacionadas