variable una tutorial programa preambulo funciones funcion estaticas estatica esta español escrito ejemplos declarada c++ c++11

c++ - una - variable static java



¿Los objetos en el espacio de nombres anónimo son implícitamente estáticos? (2)

C ++ 11, 3.5 / 4:

Un espacio de nombres sin nombre o un espacio de nombres declarado directa o indirectamente dentro de un espacio de nombres sin nombre tiene un enlace interno. Todos los demás espacios de nombres tienen un enlace externo. Un nombre que tenga un ámbito de espacio de nombres al que no se le ha dado un enlace interno anterior tiene el mismo enlace que el espacio de nombres que lo incluye si es el nombre de - una variable ...

Así que en C ++ 11, ambos de tus objetos foo tienen un enlace interno. En C ++ 03, el primero tiene un enlace externo.

Independientemente del enlace, tiene una duración de almacenamiento estático.

No creo que haya nada en la norma como "tomar el objeto como si estuviera marcado como estático", por lo que no puedo responder a eso. Si encuentra algún texto en el estándar que se refiere a si el objeto está "marcado como estático" y no se refiere específicamente a la duración del enlace o del almacenamiento, cítelo y le puedo dar una opinión :-)

Desde el punto de vista estándar de C ++ 11, ¿existe una diferencia técnica entre el estado y las propiedades del objeto entre:

namespace { int foo; const int bar = 42; }

y

namespace { static int foo; static const bar = 42; }

?

A partir de las preguntas y respuestas aquí, creía que los objetos en el espacio de nombres anónimo eran implícitamente estáticos, pero alguien me dice que solo el vínculo es interno, el compilador no tomará el objeto como si estuviera marcado como estático con implicaciones, como la forma en que implementará el objeto. construcción. Así que necesito algunos detalles sobre lo que realmente significa, si hay una diferencia entre con y sin estática en el espacio de nombres anónimo.


Hay una gran diferencia: con static , el nombre tiene un enlace interno; sin ella, tiene un enlace externo (pero está en un espacio de nombres que no puede citar en otra unidad de traducción). La diferencia no siempre es importante, pero entra en juego en algunos casos: si tiene una plantilla con un parámetro int* , por ejemplo, no puede crear una instancia en &foo si foo se declara static .

EDITAR:

Como Steve Jessop ha señalado, esto solo es cierto en C ++ 03. C ++ 11 hace un cambio aquí. Aunque no sé por qué; Considero que la especificación de C ++ 03 es más coherente: el espacio de nombres en el que se encuentra algo no debería afectar el enlace.