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 0x0007h: Las llaves deben ubicarse en líneas independientes según el estilo Allman

Sintaxis y formato visual (0x00XX)

Universidad Nacional de Río Negro

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 consecuenciaEfecto concreto
CompilaciónNinguna: el estilo de llaves es indiferente para el compilador.
LegibilidadEl encabezado y el cuerpo se mezclan en la misma línea.
ConsistenciaConviven varios estilos y las llaves dejan de guiar la vista.
MantenibilidadInsertar una sentencia al inicio del bloque exige reescribir la llave.
RevisiónEl 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

Cómo detectarla

HerramientaComandoSeñal
gaffgaff check archivo.c / gaff fix archivo.cLlave de apertura en la misma línea que la sentencia.
clang-formatclang-format --style='{BreakBeforeBraces: Allman}'Reordenamiento de llaves.
grepgrep -nE '\)\s*\{' archivo.cCandidatos a estilo K&R.

Checklist de autocontrol

Reglas relacionadas