Regla 0x0007h: Las llaves deben ubicarse en líneas independientes según el estilo Allman
Sintaxis y formato visual (0x00XX)
0x0007h: Las llaves deben ubicarse en líneas independientes según el estilo Allman¶
Enunciado normativo¶
DEBE colocarse la llave de apertura
{en una línea propia, alineada con la sentencia contenedora, y la llave de cierre}en otra línea, alineada verticalmente con la de apertura. NO DEBE usarse el estilo K&R (if (...) {).
Esto se aplica a funciones, condicionales, lazos, switch, struct, enum
y union.
¿Por qué existe esta regla?¶
El problema¶
La posición de la llave decide dónde cae la mirada del lector. En el estilo Allman, la llave de apertura ocupa su propia línea y deja la condición aislada, con lo que el encabezado del bloque se lee como una frase completa. La llave de cierre alineada con la de apertura permite recorrer visualmente la profundidad de anidación por columnas.
El estilo K&R, aunque compacto, esconde el inicio del cuerpo al final de la
línea del if y complica ver dónde termina cada bloque cuando hay muchos
niveles.
Consecuencias de violarla¶
| Tipo de consecuencia | Efecto concreto |
|---|---|
| Compilación | Ninguna: el estilo de llaves es indiferente para el compilador. |
| Legibilidad | El encabezado y el cuerpo se mezclan en la misma línea. |
| Consistencia | Conviven varios estilos y las llaves dejan de guiar la vista. |
| Mantenibilidad | Insertar una sentencia al inicio del bloque exige reescribir la llave. |
| Revisión | El diff mueve la llave y ensucia el cambio real. |
Fundamento en el estándar y en la cátedra¶
El estándar trata las llaves como tokens de puntuación de bloques (§6.8.2) y no impone su ubicación. La cátedra adopta el estilo Allman (o BSD) porque hace corresponder cada nivel de anidación con una columna, en sintonía con la indentación de 0x0004h: Cada bloque debe tener una indentación de cuatro espacios respecto a su contenedor y llaves.
Alcance y excepciones¶
Aplica a todo bloque delimitado por llaves. No alcanza a las llaves de
inicialización de agregados (int v[] = {1, 2, 3};), que se escriben en la
misma línea, ni a los bloques vacíos {} si el equipo lo acuerda.
Ejemplos exhaustivos¶
❌ Contraejemplo 1 — Llave de apertura pegada al if¶
if (x > 0) {
return x;
}Por qué falla: el cuerpo arranca en la misma línea que la condición y la llave de cierre queda alineada con una columna distinta de la esperada.
❌ Contraejemplo 2 — Función y struct en una sola línea¶
int duplicar(int x) { return x * 2; }
struct punto_t { int x; int y; };Por qué falla: la definición completa se apila en una línea y no sigue una columna de llaves que permita identificar el cuerpo de la función o del tipo.
✅ Ejemplo conforme 1 — Condicional en estilo Allman¶
if (x > 0)
{
return x;
}Justificación: la condición queda sola, el cuerpo indentado y la llave de
cierre alineada con el if, de modo que basta mirar la columna para saber
dónde termina el bloque.
✅ Ejemplo conforme 2 — Función y tipo con llaves alineadas¶
int duplicar(int x)
{
return x * 2;
}
struct punto_t
{
int x;
int y;
};Justificación: cada llave de apertura inicia una línea y la de cierre comparte columna con su apertura, tanto en la función como en el tipo.
⚠️ Casos límite¶
Inicializadores:
int v[] = {1, 2, 3};ystruct p = {0};no son bloques y van en línea.elseencadenado: en Allman,elsese escribe en su propia línea tras la llave de cierre;} else {pertenece a K&R.Llave de cierre comentada: en bloques extensos, el comentario de cierre de 0x200Dh: Comentarios de cierre explicativos en bloques de control extensos (> 25 líneas) se agrega después del
}.
Cómo detectarla¶
| Herramienta | Comando | Señal |
|---|---|---|
gaff | gaff check archivo.c / gaff fix archivo.c | Llave de apertura en la misma línea que la sentencia. |
clang-format | clang-format --style='{BreakBeforeBraces: Allman}' | Reordenamiento de llaves. |
grep | grep -nE '\)\s*\{' archivo.c | Candidatos a estilo K&R. |
Checklist de autocontrol¶
¿Cada
{abre una línea nueva alineada con su sentencia?¿Cada
}cierra en línea propia y en la misma columna que su{?¿Apliqué el estilo también a
struct,enumyunion?¿Dejé los inicializadores de agregados en la misma línea?
Reglas relacionadas¶
0x0004h: Cada bloque debe tener una indentación de cuatro espacios respecto a su contenedor y llaves — indentación de cuatro espacios dentro de cada bloque.
0x1001h: Todas las estructuras de control deben utilizar llaves — llaves obligatorias aunque el cuerpo sea de una línea.
0x200Dh: Comentarios de cierre explicativos en bloques de control extensos (> 25 líneas) — comentario de cierre en bloques de más de 25 líneas.
0x100Eh: Delimitación obligatoria con bloque de llaves en lazos do-while — llaves explícitas en los lazos
do-while.0x1008h: Toda instrucción switch debe incluir un caso default — todo
switchcierra condefault.