Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Regla 0x6003h: Declará cada variable lo más cerca posible de su primer uso

Proceso, diseno y construccion sistematica (0x60XX)

Universidad Nacional de Río Negro

0x6003h: Declará cada variable lo más cerca posible de su primer uso

Enunciado normativo

DEBE declararse cada variable en el bloque más interno que la necesite y lo más cerca posible de la primera sentencia que la usa. NO DEBE declararse un bloque de variables al inicio de la función por costumbre.

¿Por qué existe esta regla?

El problema

Una variable declarada cincuenta líneas antes de usarse obliga al lector a recordar su existencia y su tipo durante todo ese trayecto. Peor: si el alcance es más amplio de lo necesario, nada impide que otra parte del código la modifique, y el valor observado en el uso ya no es el que se declaró.

C declaró históricamente (C89) todas las variables al inicio del bloque por una restricción del lenguaje que ya no existe: desde C99 se pueden declarar en cualquier punto. Mantener el hábito antiguo es anacrónico y perjudicial.

Consecuencias de violarla

Tipo de consecuenciaEfecto concreto
Bug silenciosoOtra rama reutiliza la variable y arrastra un valor inesperado.
LecturaEl lector salta constantemente entre la declaración y el uso.
DepuraciónEl alcance amplio multiplica los puntos que pueden romper la variable.
InicializaciónEs más fácil olvidar inicializar algo declarado lejos de su uso.

Fundamento en el estándar C11

ISO/IEC 9899:2011 §6.2.1 permite declaraciones en cualquier punto de un bloque. Declarar cerca del uso es la práctica idiomática moderna y la que exige la cátedra.

Alcance y excepciones

Aplica a variables locales y a punteros auxiliares. No aplica a parámetros ni a variables de alcance de archivo, que tienen reglas propias (0x0106h: Las variables globales deben ser declaradas como static o usar prefijo g_).

Ejemplos exhaustivos

❌ Contraejemplo 1 — Bloque de declaraciones al inicio

int calcular(int v[], int n)
{
    int i, j, suma, promedio, maximo, minimo;
    int hay_datos;
    /* ... treinta líneas de otras operaciones ... */

    suma = 0;
    for (i = 0; i < n; i++) {
        suma += v[i];
    }

    promedio = suma / n;
    return promedio;
}

Por qué falla: j, maximo, minimo y hay_datos se declaran y nunca se usan (o se usan mucho después); abundan variables sin inicializar y el alcance de i cubre toda la función sin necesidad.

❌ Contraejemplo 2 — Alcance amplio que habilita reutilización accidental

int total = 0;
for (int i = 0; i < n; i++) {
    total += v[i];
}

total = 0;    /* se reutiliza para otra cosa */
for (int i = 0; i < m; i++) {
    total += w[i];
}

Por qué falla: reutilizar total para dos acumuladores distintos confunde la lectura y hace imposible inspeccionar el primero en el depurador (ver 0x6004h: No reutilices una variable para propósitos distintos).

✅ Ejemplo conforme 1 — Declaración en el punto de uso

int calcular(const int v[], size_t n)
{
    int suma = 0;
    for (size_t i = 0; i < n; i++) {
        suma += v[i];
    }

    return suma / (int)n;
}

i nace y muere dentro del for; suma se declara e inicializa donde se usa. No hay nada que recordar a distancia.

✅ Ejemplo conforme 2 — Alcance mínimo explícito

size_t contar_pares(const int v[], size_t n)
{
    size_t pares = 0;
    for (size_t i = 0; i < n; i++) {
        if (v[i] % 2 == 0) {
            pares++;
        }
    }
    return pares;
}

Cada variable vive únicamente en el bloque que la necesita; si una función futura necesita otra, declarará la suya.

⚠️ Casos límite

Cómo detectarla

HerramientaComandoSeñal
gaffgaff check archivo.cRegla 0x2006h (alcance mínimo).
gccgcc -Wall -Wextra-Wunused-variable delata declaraciones lejanas sin uso.

Checklist de autocontrol

Reglas relacionadas