2010-08-19 9 views
9

static es una palabra clave sobrecargada en C. Aquí, solo estoy interesado en su uso como palabra clave para hacer cumplir la vinculación interna.Enlace interno con la palabra clave estática en C

Si tiene una variable global declarada en un archivo .c, ¿cuál es la diferencia entre usar static y no usar static? De cualquier manera, ningún otro archivo .c tiene acceso a la variable, por lo que la variable es básicamente "privada" para el archivo, con o sin la palabra clave estática.

Por ejemplo, si tengo un archivo foo.c, y declarar una variable global:

int x = 5;

esa variable x sólo está disponible para código dentro foo.c (a menos que, por supuesto, que declaran que en algunos compartida archivo de encabezado con la palabra clave extern). Pero si no lo declaro en un archivo de encabezado, ¿cuál sería la diferencia si tuviera que escribir:

static int x = 5.

De cualquier manera, parece que x tiene un enlace interno aquí. Así que estoy confundido en cuanto al propósito de static en este sentido.

+2

Casi respondiste tu propia pregunta: dijiste "si no lo declaro en un archivo de encabezado", lo que significa "si no escribo una declaración con la palabra clave 'extern'". El punto es que es * imposible * escribir tal declaración si has declarado que tu variable estática, mientras que si no lo has hecho, alguien más podría venir y hacerlo, enlazar con tu código y tener acceso a tu variable. (Además de lo que menciona Pascal Cuoq.) – Cascabel

+0

posible duplicado de [¿Qué significa "estático" en un programa C?] (Http://stackoverflow.com/questions/572547/what-does-static-mean-in- ac-program). en particular, abordo ese caso en mi respuesta: http://stackoverflow.com/a/14339047/895245 –

Respuesta

10

Si tiene una variable global declarada en un archivo .c, ¿cuál es la diferencia entre usar y no usar staticstatic? De cualquier manera, ningún otro archivo .c tiene acceso a la variable [...]

un archivo diferente podría declarar x:

extern int x; 

Eso permitiría código de referencia x para compilar, y el enlazador vincularía felizmente esas referencias a cualquier x que encuentre.

static evita esto al evitar que x sea visible fuera de su unidad de traducción.

+0

Eso es interesante. ¿No parece una característica muy profética para un momento en que la encapsulación de datos no se practicaba o fomentaba ampliamente? – Channel72

+0

En otras palabras, global permite múltiples declaraciones a través de archivos para compartir una única definición usando 'extern' donde no lo es estático. ¿Derecha? – naivnomore

+0

@ Channel72: Bueno, esa es la razón por la que los datos globales están mal visto: no está encapsulado. Si lo fuera, no sería datos _global_. – sbi

6

Hay solo un "espacio de nombres", por así decirlo, en C. Sin la palabra clave "estática" no está protegido de otro archivo con el nombre "x" (incluso si no lo hace visible en su propio encabezado de la biblioteca).

Intente vincular juntos varios archivos C que contienen una variable no estática x (entrelazando los accesos de lectura y escritura de las funciones en cada archivo), y compare con la situación donde estas variables se declaran estáticas.

+0

Por supuesto, si ninguno de esos archivos * inicializa * la x global, es posible que esté recibiendo un bloque común ... .incluso si los tipos de sus diferentes 'x' difieren. Agradezca la necesidad de apoyar también a FORTRAN en el enlazador de ese. – RBerteig

+0

@RBerteig Sí, sin inicialización fue lo que quise decir. El lector que se pregunta de qué estamos hablando puede visitar, p. http://stackoverflow.com/questions/1490693/tentative-definitions-in-c99-and-linking –

+0

Simplemente tienes que amar todas esas pequeñas y oscuras características y rincones ... – RBerteig

Cuestiones relacionadas