DMarlon Studio

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.

C · Ámbito y variables static en DMarlon Studio: el código del ejemplo y su salida en la terminal

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.
  • static conserva 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.