2010-07-29 11 views
23

¿Cuál es la diferencia entre estos dos?espacio de nombre anónimo

CPP-archivo:

namespace 
{ 
    int var; 
} 

o

int var; 

si ambos se ponen en el archivo CPP? ¿No es correcto que pongamos una variable en el espacio de nombres anónimo para que pueda ser privado solo para ese archivo? Pero si ponemos una variable global en un archivo cpp, ¿no es esa variable también privat porque nunca haces un archivo include para .cpp?

Respuesta

29

En su segundo caso, cuando no utiliza un espacio de nombre anónimo, si cualquier otro archivo cpp declara un extern int var;, podrá usar su variable.

Si usa un espacio de nombre anónimo, en el momento del enlace, el otro archivo cpp generará un error de referencia no definido.

+2

Así que creo que puede obtener el mismo resultado estableciendo la variable como estática. – Dacav

+0

Es cierto.También en C++ definiéndolo como const, que implicará estática. –

+1

@Dacav: cierto. pero la forma C++ de hacerlo es usar un espacio de nombre anónimo. El uso de estática es solo el resultado de que C++ sea compatible con versiones anteriores de C. –

3

La segunda versión se define en el espacio de nombres global - otros archivos .cpp pueden llegar a ella, declarando

extern int var;

e incluso si no lo hacen, si otra persona utiliza el mismo nombre en el espacio de nombre global, obtendrá un error de enlace (símbolo de multiplicación definida).

4

En el segundo caso .cpp otros archivos puede acceder a la variable como:

extern int var; 
var = 42; 

y el enlazador, la encontrará. En el primer caso, el nombre de la variable se destruye más allá de cualquier razón :) por lo que lo anterior no es posible.

2

Además de la razón dada por Nikolai y otros, si no utiliza un espacio de nombre anónimo, puede obtener conflictos de nombres con otros datos globales. Si utiliza un espacio de nombre anónimo, en su lugar sombreará los datos globales.

De cprogramming.com: "Dentro del espacio de nombre se le garantiza que no habrá conflictos entre los nombres globales porque los nombres de función de cada espacio de nombres tienen prioridad sobre los nombres de las funciones externas".

1

dos puntos:

  1. cualquier persona que utilice extern int var; puede acceder a la variable si no es en un espacio de nombres sin nombre.
  2. si en otro archivo, tiene otra variable global int var, tendrá múltiples definiciones de esta variable.

Según se especifica en la norma:

[...] todas las apariciones de una unidad única en traducción se sustituyen por el mismo identificador y este identificador se diferencia de todos los otros identificadores en todo el programa

Cuestiones relacionadas