0x0002h: Una declaración de variable por línea¶
Enunciado normativo¶
DEBE declararse cada variable en su propia línea y escribirse cada sentencia en una línea separada. NO DEBE apilar varias declaraciones ni varias sentencias en una misma línea.
La regla alcanza tanto a las declaraciones como a las sentencias ejecutables.
¿Por qué existe esta regla?¶
El problema¶
Una línea con int a, b, c; parece una sola acción, pero son tres objetos
independientes con vidas y tipos potencialmente distintos. En las
declaraciones compuestas de punteros el problema es peor: en int *a, b;
solo a es puntero y b es un entero, una trampa clásica que la regla
elimina de raíz.
Además, el depurador trabaja a nivel de línea de código fuente: si dos sentencias comparten línea, el punto de interrupción las abarca a ambas y no se puede detener el programa entre una y otra.
Consecuencias de violarla¶
| Tipo de consecuencia | Efecto concreto |
|---|---|
| Compilación | Ninguna por sí sola; puede ocultar el error de tipo en int *a, b;. |
| Depuración | El breakpoint de GDB no distingue las sentencias de la misma línea. |
| Bug silencioso | Variables agrupadas se inicializan u olvidan en bloque. |
| Mantenibilidad | Agregar un comentario por variable es imposible sin reescribir la línea. |
| Legibilidad | El diff de control de versiones mezcla cambios de variables distintas. |
Fundamento en el estándar y en la cátedra¶
El estándar permite listas de declaradores (§6.7) y secuencias de sentencias
separadas por ; (§6.8.3), así que la restricción es puramente de estilo.
La cátedra la adopta porque la depuración con GDB y la trazabilidad línea a
línea son objetivos de aprendizaje tempranos.
Alcance y excepciones¶
Aplica a declaraciones locales, globales y sentencias. No alcanza a la
cabecera de un for, donde la inicialización y el incremento comparten
obligatoriamente la misma línea, ni a la lista de parámetros de una función,
que no son declaraciones independientes.
Ejemplos exhaustivos¶
❌ Contraejemplo 1 — Declaración múltiple¶
int a, b, c;
a = 1; b = 2; c = 3;Por qué falla: tres variables y tres asignaciones quedan invisibles para el depurador; además impide inicializar cada una según su rol.
❌ Contraejemplo 2 — Puntero escondido en una lista¶
int *ptr, contador;Por qué falla: solo ptr es puntero. Quien lee rápido asume que contador
también lo es y comete un error de tipos difícil de rastrear.
✅ Ejemplo conforme 1 — Una variable por línea¶
int cantidad = 0;
int total = 0;
int *ptr = NULL;Justificación: cada declaración expone su tipo, su nombre y su valor inicial en una línea que se puede comentar, mover o poner bajo breakpoint.
✅ Ejemplo conforme 2 — Una sentencia por línea¶
int mayor = edades[0];
int menor = edades[0];
for (size_t i = 0; i < cantidad; i++)
{
if (edades[i] > mayor)
{
mayor = edades[i];
}
if (edades[i] < menor)
{
menor = edades[i];
}
}Justificación: el cuerpo separa las dos comparaciones; cada actualización es
un paso observable y el for conserva su cabecera compacta por convención.
⚠️ Casos límite¶
forcomo excepción:for (size_t i = 0; i < n; i++)es la forma idiomática; la regla no lo fragmenta.Parámetros:
int sumar(int a, int b)no viola la norma; los parámetros se separan por comas, no por líneas.Declaraciones dependientes: si
bdepende dea, conviene declararlas contiguas e inicializarbconaya definido.
Cómo detectarla¶
| Herramienta | Comando | Señal |
|---|---|---|
gaff | gaff check archivo.c | Líneas con más de un ; o listas de declaradores. |
gcc / clang | gcc -Wall -Wextra -std=c11 -pedantic | -Wunused-variable reporta la variable de la lista que quedó sin usar. |
| GDB | gdb ./prog + break linea | La parada cae en varias sentencias a la vez. |
Checklist de autocontrol¶
¿Cada variable tiene su propia línea?
¿Evité
int *a, b;y listas similares?¿Puedo poner un breakpoint en cada paso relevante?
¿Cada sentencia ejecutable está sola en su línea?
Reglas relacionadas¶
0x000Ah: Prohibición de espacios en blanco antes de separadores de sintaxis (; y ,) — no dejar espacio antes de
;ni de,.0x000Dh: Espacio en blanco obligatorio tras la coma separadora en listas y argumentos — espacio obligatorio después de la coma en listas.
0x0004h: Cada bloque debe tener una indentación de cuatro espacios respecto a su contenedor y llaves — la indentación hace visible la separación de sentencias.
0x7001h: Siempre debés inicializar las variables a un valor conocido — cada variable declarada conviene inicializarla en su línea.
0x0001h: La claridad y prolijidad son de máxima importancia — principio general del que esta regla es una aplicación.