Regla 0x0004h: Cada bloque debe tener una indentación de cuatro espacios respecto a su contenedor y llaves
Sintaxis y formato visual (0x00XX)
0x0004h: Cada bloque debe tener una indentación de cuatro espacios respecto a su contenedor y llaves¶
Enunciado normativo¶
DEBE indentarse cada bloque con exactamente cuatro espacios por nivel de anidación respecto de su contenedor. NO DEBE mezclarse tabulaciones con espacios ni usarse anchos distintos dentro del mismo archivo.
La indentación refleja la jerarquía sintáctica del programa.
¿Por qué existe esta regla?¶
El problema¶
La indentación es la única señal visual que revela a qué bloque pertenece
cada sentencia. Sin ella, un if anidado y su else parecen hermanos, y el
intérprete humano del código reconstruye mal el flujo. Cuatro espacios son
suficientes para distinguir niveles sin empujar el código fuera de la
pantalla cuando hay anidación moderada.
Mezclar tabulaciones y espacios es aún más grave: el mismo archivo se ve distinto en cada editor, y una llave puede aparecer alineada para un lector y desalineada para otro. Lo que el compilador ignora, el revisador lo sufre.
Consecuencias de violarla¶
| Tipo de consecuencia | Efecto concreto |
|---|---|
| Compilación | Ninguna: el preprocesador descarta el espaciado. |
| Bug silencioso | Anidación mal percibida produce errores de alcance y de else colgante. |
| Mantenibilidad | Mover un bloque obliga a reindentar manualmente todo su interior. |
| Portabilidad visual | Tabs y espacios se expanden distinto según la configuración del editor. |
| Revisión | El diff muestra ruido cuando un editor reindenta con otro criterio. |
Fundamento en el estándar y en la cátedra¶
El estándar clasifica los espacios como white-space sin significado (§6.4). La cátedra fija cuatro espacios, en consonancia con el estilo Allman de 0x0007h: Las llaves deben ubicarse en líneas independientes según el estilo Allman, para que llaves y sentencias formen columnas predecibles.
Alcance y excepciones¶
Aplica a cuerpos de función, estructuras de control, struct, enum y
union. Las líneas de continuación de expresiones largas se indentan ocho
espacios (dos niveles) o se alinean tras el paréntesis; el case dentro de
un switch se indenta un nivel respecto del switch.
Ejemplos exhaustivos¶
❌ Contraejemplo 1 — Cuerpo sin bloque ni sangría¶
if (condicion)
accion();Por qué falla: sin llaves ni indentación no hay pista visual de que accion()
depende del if; un cambio futuro agrega otra sentencia y solo la primera
queda condicionada.
❌ Contraejemplo 2 — Niveles dispares y tabs mezclados¶
if (a > b)
{
if (b > c)
{
printf("mayor\n");
}
}Por qué falla: el segundo nivel usa dos espacios y el tercero una tabulación; en otro editor la estructura se ve rota.
✅ Ejemplo conforme 1 — Un nivel, cuatro espacios¶
if (a > b)
{
if (b > c)
{
printf("a es el mayor\n");
}
}Justificación: cada nivel agrega exactamente cuatro espacios y las llaves alineadas permiten barrer la jerarquía con la vista.
✅ Ejemplo conforme 2 — switch y continuación¶
switch (estado)
{
case ACTIVO:
procesar();
break;
default:
break;
}Justificación: el switch no indenta sus llaves y cada case agrega un
nivel; la separación con líneas en blanco agrupa visualmente cada rama.
⚠️ Casos límite¶
Preprocesador: las directivas
#if/#includevan en la columna 1 aunque estén dentro de un bloque; no siguen la indentación lógica.Etiquetas
goto: se ubican al margen izquierdo por 0x0013h: Detector de etiquetas de salto goto no alineadas al margen izquierdo.Continuaciones: una expresión cortada debe sangrar con claridad, no a ojo; usar exactamente ocho espacios evita la ambigüedad.
Cómo detectarla¶
| Herramienta | Comando | Señal |
|---|---|---|
gaff | gaff check archivo.c / gaff fix archivo.c | Indentación que no es múltiplo de cuatro o mezcla de tabs. |
grep | grep -nP '^\t' archivo.c | Tabulaciones al inicio de línea. |
| Editor | Mostrar espacios/tabs | Columnas fuera de la rejilla de cuatro. |
Checklist de autocontrol¶
¿Cada nivel de anidación son exactamente cuatro espacios?
¿Usé espacios, nunca tabulaciones?
¿Las llaves están alineadas según 0x0007h: Las llaves deben ubicarse en líneas independientes según el estilo Allman?
¿Reindenté todo bloque que moví?
Reglas relacionadas¶
0x0007h: Las llaves deben ubicarse en líneas independientes según el estilo Allman — estilo Allman: llaves en línea propia y alineadas.
0x1001h: Todas las estructuras de control deben utilizar llaves — llaves obligatorias en toda estructura de control.
0x0008h: Alineación vertical consistente en asignaciones y declaraciones consecutivas — consistencia de sangría en declaraciones consecutivas.
0x0002h: Una declaración de variable por línea — una sentencia por línea, base de la estructura visual.
0x0013h: Detector de etiquetas de salto goto no alineadas al margen izquierdo — excepción de alineación para etiquetas de salto.