2010-07-19 10 views
15

¿Cuál es la clase de almacenamiento predeterminada de una variable global?¿Cuál es la clase de almacenamiento predeterminada para las variables globales?

Mientras buscaba en la web encontré, algunos sitios dicen que es static. Pero, static significa enlace interno y la variable no puede estar disponible fuera del alcance del archivo, es decir, no debería estar disponible para otros archivos objeto. Pero aún se puede acceder a otros archivos usando declaraciones como extern int i.

Y, si explícitamente menciono static como variable global, entonces no está disponible fuera del alcance del archivo.

Entonces, ¿cuál es la clase de almacenamiento predeterminada correcta para las variables globales?

Respuesta

15

La duración de almacenamiento predeterminada es estática, pero la vinculación predeterminada es externa. No eres el único que lo encuentra un poco confuso. The C Book (siempre es una buena referencia) dice:

"probablemente encontrará las interacciones entre estos diversos elementos para ser tanto complejo y confuso: eso es porque son"

La sección con esa cita, Declarations, Definitions and Accessibility, tiene una tabla de ayuda (8.1). La última fila describe el caso que le interesa. Como se observa, los objetos de datos sin especificador de clase de almacenamiento tienen enlaces externos y duración estática.

+0

pero para tener un enlace interno definimos global como 'static int i' y si la clase de almacenamiento predeterminada de una variable global es estática, su definición sería' static int i', lo que significa enlace interno. –

+0

Como dije, el enlace predeterminado es externo. El valor predeterminado de static solo se aplica a la duración. –

+1

Para lanzar otra llave en los trabajos: en C++, los objetos constantes tienen un enlace interno por defecto. –

16

No existe una "clase de almacenamiento predeterminada" para lo que comúnmente se conoce como variables "globales". Cuando se define una variable en el ámbito del espacio de nombres, siempre tiene duración de almacenamiento estático. No hay forma de cambiar eso, por lo que la idea de algo "predeterminado" no es aplicable aquí. (Y la duración almacenamiento es lo que se llama correctamente.)

Cuando se aplica la palabra clave static a una variable definida en el alcance de espacio de nombres que no afecta a su duración almacenamiento - era estática ya y permanece estático - pero lo afecta linkage. La palabra clave static cambia la vinculación de dicha variable de externa (por defecto) a interna. La vinculación es un concepto separado, prácticamente no relacionado con duración de almacenamiento.

Cuestiones relacionadas