Un poco de historia:
Como otros han señalado, son variables estáticas tienen vinculación interna, lo que significa que sólo se pueden utilizar en la misma "unidad de compilación" o archivo de origen. Eso significa que no puede declararlo en un archivo de encabezado, asignarle un valor en una unidad de compilación y esperar que ese valor aparezca en otro.
Cuando inicializa una variable global (estática o no), el compilador simplemente coloca el valor inicial en el archivo ejecutable en la ubicación de memoria asignada para la variable. En otras palabras, siempre tiene un valor inicial. Por supuesto, siempre puede anular el valor más tarde mediante el uso de una declaración de asignación.
Sugerencias:
Si realmente no se conoce el valor de la variable en tiempo de compilación, entonces deben asignar de forma dinámica en su función de inicialización.
static some_type some_variable; /* = 0 by default */
/* some code */
void MyInitializations()
{
some_variable = some_value;
}
Si desea declarar la variable en un solo lugar, dicen que un archivo de cabecera, y lo definen en un archivo de origen, entonces debe usar una declaración 'extern' que le dice al compilador que no se preocupe por donde el variable es. El vinculador encontrará la ubicación de la variable de forma similar a como encuentra una función en otro archivo y completa la dirección.
Cabecera:
extern some_type some_variable;
archivo Fuente 1:
void UseSomeVariable()
{
x = some_variable;
}
archivo Fuente 2:
some_type some_variable = some_value;
/* possible also uses some_variable */
Si lo que desea es declarar la variable en un lugar y definirlo en otra, no use la palabra clave "estática". La desventaja de esto es que no puede usar la misma variable global en diferentes unidades de compilación (archivos .c) y no puede usarla en un archivo de encabezado.
estático significa que está cargado en tiempo de compilación. ¿Por qué no quieres inicializarlo? – Woot4Moo
Woot4Moo: Hacer que una variable global sea "estática" en C significa que no está visible fuera de la "unidad de compilación" actual, generalmente un archivo .c y todos sus encabezados. Todas las variables globales que no son 'externas' tienen espacio asignado en tiempo de compilación. – Anton