Entendiendo la clase de almacenamiento estático en C

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?