Lección 14 · 14 de 20
Ámbito y variables static · C
Entienda dónde vive cada variable en C: globales, locales, de bloque y static, que conservan su valor entre llamadas a una función.

El ámbito de una variable es la parte del programa donde existe. total_visits está fuera de cualquier función: es global y todas las funciones que vienen después pueden usarla y cambiarla. Úselas con moderación, porque cualquiera puede modificarlas.
Las variables declaradas dentro de una función son locales: nacen en cada llamada y desaparecen al terminar. Por eso local vale siempre 1: cada vez empieza de nuevo en 0 y se suma uno.
Con `static`, una variable local se crea una sola vez y conserva su valor entre llamadas, aunque solo se vea dentro de su función. calls cuenta 1, 2, 3, y next_ticket reparte números seguidos a partir de 101. ++number suma uno y entrega ya el valor nuevo.
Cada bloque { } crea su propio ámbito. El lives de dentro del bloque es otra variable que oculta a la de fuera mientras dura el bloque; al salir, vuelve a verse la de fuera, con su 3. Del mismo modo, la i del for deja de existir al acabar el bucle.
Código · main.c
#include <stdio.h>int total_visits = 0; // global: every function below can use itvoid visit(const char page[]) { static int calls = 0; // static: keeps its value between calls int local = 0; // a normal local starts again on every call calls++; local++; total_visits++; printf("%-5s calls=%d local=%d\n", page, calls, local);}int next_ticket(void) { static int number = 100; // set to 100 only the first time return ++number; // add 1, then give the new value}int main(void) { visit("home"); visit("shop"); visit("cart"); printf("Total visits: %d\n", total_visits); for (int i = 0; i < 3; i++) printf("Ticket %d\n", next_ticket()); int lives = 3; { // a block has its own scope: this lives hides the outer one int lives = 99; printf("inside the block: lives = %d\n", lives); } printf("outside the block: lives = %d\n", lives); return 0;}Salida · cc main.c -o main && ./main
home calls=1 local=1 shop calls=2 local=1 cart calls=3 local=1 Total visits: 3 Ticket 101 Ticket 102 Ticket 103 inside the block: lives = 99 outside the block: lives = 3
Para recordar
- Una variable global se ve en todo el archivo.
- Una variable local nace y muere con cada llamada.
staticconserva el valor entre llamadas.- Un bloque
{ }tiene su propio ámbito. - Una variable de dentro oculta a otra del mismo nombre de fuera.
Ejercicio
Escriba una función void log_message(const char text[]) que numere sus mensajes con una variable static («1: start», «2: load»…) y llámela cuatro veces.