En el lenguaje C, el almacenamiento de variables determina dónde se almacenan los datos, cuánto tiempo están disponibles y qué parte del código puede acceder a ellos. Históricamente, las palabras clave auto (por defecto para variables locales), static (mantiene el valor entre llamadas, a menudo utilizado para almacenar estado) y extern (declara una variable definida en otro lugar) se introdujeron para controlar el ámbito y el tiempo de vida de las variables.
Problema — una comprensión incorrecta de dónde y cuánto vive una variable puede llevar a errores de acceso, fugas de memoria y código difícil de leer. Por ejemplo, esperar erróneamente que una variable local static se recreará en cada llamada a la función, o por el contrario, que una variable auto conservará su valor entre llamadas.
Solución — siempre elegir conscientemente el especificador de almacenamiento y entender sus consecuencias:
Ejemplo de uso:
// main.c int global_var = 42; // tiene almacenamiento static por defecto, linkage externo void func() { static int counter = 0; // vive entre llamadas auto int temp = 5; // local, no es necesario especificar auto counter++; printf("llamada #%d\n", counter); } extern int global_var;
Características clave:
¿Para qué escribir auto, si las variables ya son auto por defecto?
Respuesta: En versiones modernas de C, la palabra clave auto casi no se utiliza de forma explícita — para las variables locales, es el especificador por defecto. En general, su escritura explícita no ofrece ninguna ventaja.
¿Se puede usar static dentro de una función para declarar una variable global?
Respuesta: No, static dentro de una función hace que la variable sea local, pero manteniendo el estado entre llamadas. No es visible fuera de la función.
Ejemplo de código:
void foo() { static int call_count = 0; // No es global, pero vive entre llamadas call_count++; }
¿Qué sucederá si se declara una variable como extern dentro de una función, pero no se define en ningún lugar?
Respuesta: Esto provocará un error de enlace (linker error), porque se declara una referencia a una variable global que no existe.
En un gran proyecto, las variables-módulos se declararon como extern en todos los archivos fuente, pero se olvidaron de hacer la definición. Como resultado — errores de enlace misteriosos, poco claros para los desarrolladores novatos.
Ventajas:
Desventajas:
Se definieron estrictamente los ámbitos: cada variable static solo en el módulo necesario, extern globales se declararon en encabezados y se definieron en un solo lugar.
Ventajas:
Desventajas: