Regla 0x6003h: Declará cada variable lo más cerca posible de su primer uso
Proceso, diseno y construccion sistematica (0x60XX)
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 consecuencia | Efecto concreto |
|---|---|
| Bug silencioso | Otra rama reutiliza la variable y arrastra un valor inesperado. |
| Lectura | El lector salta constantemente entre la declaración y el uso. |
| Depuración | El alcance amplio multiplica los puntos que pueden romper la variable. |
| Inicialización | Es 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¶
Objetos grandes de pila: en algunos entornos se sigue prefiriendo declarar al inicio por convención, pero la cátedra prioriza el alcance mínimo.
Compatibilidad C89: si el proyecto fijara
-std=c89habría que agrupar declaraciones; la cátedra usa C11 y no aplica.Inicialización obligatoria: declarar cerca del uso no exime de inicializar (0x7001h: Siempre debés inicializar las variables a un valor conocido).
Cómo detectarla¶
| Herramienta | Comando | Señal |
|---|---|---|
gaff | gaff check archivo.c | Regla 0x2006h (alcance mínimo). |
gcc | gcc -Wall -Wextra | -Wunused-variable delata declaraciones lejanas sin uso. |
Checklist de autocontrol¶
¿Declaré la variable en el bloque que la usa?
¿Está inicializada en su declaración?
¿Su alcance es el mínimo posible?
¿Eliminé las variables declaradas y nunca usadas?
Reglas relacionadas¶
0x2006h: Mantené el alcance de las variables al mínimo posible — alcance mínimo, regla vigente que esta propuesta pone en práctica.
0x7001h: Siempre debés inicializar las variables a un valor conocido — inicialización obligatoria.
0x6004h: No reutilices una variable para propósitos distintos — no reutilizar variables con alcance amplio.
0x0101h: Los identificadores deben ser descriptivos — nombres descriptivos incluso en alcances breves.