En C, las variables pueden tener diferentes ámbitos de visibilidad: local (dentro de un bloque), global (en todo el archivo) y ámbito de visibilidad dentro del archivo (static). La gestión correcta de los ámbitos de visibilidad es importante para la predictibilidad del funcionamiento y para prevenir conflictos de nombres.
Son visibles en todas las funciones del archivo, y si se declaran con extern, son visibles en todo el proyecto.
Se crean al entrar en un bloque (por ejemplo, una función o un bucle). No son visibles fuera del bloque de declaración.
static int foo; — solo para el archivo actual.
Ejemplo:
static int counter = 0; // Solo dentro del archivo void increment() { int temp = 10; // variable local ++counter; }
Si las variables global y local tienen el mismo nombre, ¿cuál de ellas se usa dentro de la función y por qué?
Respuesta: Se usa la local, ya que "oculta" (shadowing) el nombre global dentro de su ámbito de visibilidad. La variable global sigue siendo accesible fuera del bloque de declaración de la variable local.
Ejemplo:
int value = 5; void foo() { int value = 10; printf("%d", value); // imprimirá 10, no 5 }
Historia
Historia
static para una función auxiliar y una variable, lo que llevó a conflictos de nombres durante la vinculación (linking), así como a errores impredecibles al compilar diferentes partes del proyecto.Historia
Se han encontrado casos en los que se usaban variables globales en código multihilo sin la debida sincronización. Debido al ámbito de visibilidad implícito y la falta de atención al modificar valores en diferentes hilos, se dieron condiciones de carrera (data race).