static
es la clase de almacenamiento predeterminada para variables globales. Las dos variables siguientes ( Count
y Road
) tienen ambas clases de almacenamiento static
.
static int Count; int Road; int main() { printf("%d\n", Road); return 0; }
Mi pregunta es: si las variables globales por defecto son static
(lo que significa que estamos limitando el scope de esa variable global a ese archivo .c
particular), entonces, ¿cómo podemos extern
esas variables en otro archivo?
Esta pregunta puede ser muy básica para muchos de ustedes, pero estoy realmente confundido y quiero aprender los detalles correctos.
En la terminología de C formal, los especificadores como extern
, static
, register
, etc. se denominan especificadores de clase de almacenamiento , pero las propiedades reales del objeto que controlan estos especificadores se denominan duración y vinculación del almacenamiento .
En su pregunta, parece estar mezclando estos dos conceptos no relacionados: la duración del almacenamiento y la vinculación . En realidad, es la vinculación que describe la visibilidad externa del objeto.
Todas las variables definidas en el scope del archivo tienen una duración de almacenamiento estática (independientemente de si usó la palabra clave static
en la statement). Esto simplemente significa que viven para siempre, pero no dice nada sobre su visibilidad externa. Mientras tanto, las variables definidas con palabra clave static
tienen vinculación interna, mientras que las variables definidas sin ninguna palabra clave o con palabra clave extern
tienen vinculación externa.
En su variable de ejemplo, Road
tiene una duración de almacenamiento estático y un enlace externo , por lo que puede acceder directamente desde otras unidades de traducción. La Count
variable tiene una duración de almacenamiento estático y un enlace interno , por lo que no puede acceder a él directamente desde otras unidades de traducción.
Si declara una variable sin un especificador de clase de almacenamiento (como Road
en su ejemplo), se tratará como la llamada definición tentativa y finalmente se resolverá (en su ejemplo) a una variable con duración de almacenamiento estático y enlace externo . Entonces, desde ese punto de vista, es correcto decir que el especificador de clase de almacenamiento predeterminado (implícito) para las variables de scope del archivo es en realidad extern
, no static
.
A la variable Count
solo se puede acceder por su nombre dentro de este único archivo de origen debido a la static
que lo precede. Formalmente, se dice que tiene enlaces internos (ver ISO / IEC 9899: 2011 §6.2.2 Enlaces de Identificadores).
Se podría acceder a la variable Road
desde otros archivos de origen si esos archivos incluyeran el equivalente de extern int Road;
Como una de las afirmaciones. Formalmente, se dice que tiene un enlace externo .
En general, la mayoría de la gente llamaría Count
una variable estática y Road
una variable global.
Ver también ¿Qué son las variables extern
en C?