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 0x0112h: Usá constantes simbólicas para todo literal con significado

Nomenclatura e identificadores (0x01XX)

Universidad Nacional de Río Negro

0x0112h: Usá constantes simbólicas para todo literal con significado

Enunciado normativo

Todo literal cuyo significado no sea evidente por sí mismo (0, 1, '\0', NULL) DEBE reemplazarse por una constante simbólica con nombre de dominio (#define, const o enum). NO DEBE repetirse un número o cadena “mágica” directamente en las expresiones.

¿Por qué existe esta regla?

El problema

Un número suelto no dice qué representa. if (x > 120) no informa si 120 es una edad máxima, un ancho de pantalla o un límite de negocio. Peor aún: el mismo número puede aparecer en contextos distintos con significados distintos, y modificarlo por error en uno solo corrompe el programa.

Una constante con nombre convierte un valor en documentación: el lector entiende la intención, y el mantenimiento cambia un único lugar.

Consecuencias de violarla

Tipo de consecuenciaEfecto concreto
Bug silenciosoCambiar un literal en un lugar y olvidarlo en otro.
LecturaEl significado del número debe inferirse del contexto.
ConsistenciaEl mismo concepto usa valores distintos según el archivo.
TestingNo se pueden referenciar los límites en las pruebas.

Fundamento en la cátedra

Desarrolla 0x010Fh: Prohibición de constantes numéricas mágicas en índices de arreglos (prohibición de índices mágicos) a todo literal con significado, y se apoya en 0x0103h: Las constantes (const o #define) deben nombrarse en MAYUSCULAS_SNAKE_CASE para la forma del nombre y en 0x300Dh: Utilizá enum en lugar de ‘números mágicos’ para conjuntos de estados y valores constantes para los conjuntos de estados.

Alcance y excepciones

No requieren símbolo los literales autoexplicativos por convención universal: 0 para contadores, 1 para incrementos unitarios, '\0', NULL, EOF, los índices 0 y 1 en contextos obvios, y 0.0/1.0 como elementos neutros. Tampoco los valores usados una única vez y con comentario inmediato, aunque la cátedra prefiere el símbolo.

Ejemplos exhaustivos

❌ Contraejemplo 1 — Número mágico repetido

if (edad > 120) {
    /* error */
}

/* ... */
double recargo = precio * 1.21;

/* ... */
if (peso > 120) {
    /* ... */
}

Por qué falla: 120 aparece con dos significados distintos (edad máxima, límite de peso) y 1.21 es el IVA sin nombre. Un cambio de alícuota exige buscar todos los literales.

❌ Contraejemplo 2 — Cadena mágica de estado

if (strcmp(estado, "ABIERTO") == 0) {
    /* ... */
}

Por qué falla: la cadena se repite y un error de tipeo ("ABIERTO", con una R) compila y falla en runtime. Conviene un enum o una constante.

✅ Ejemplo conforme 1 — Constantes con nombre

#define EDAD_MAXIMA   120
#define ALICUOTA_IVA  1.21

if (edad > EDAD_MAXIMA) {
    /* error */
}

double precio_final = precio * ALICUOTA_IVA;

Cada valor tiene un único lugar de definición y un nombre que explica su significado.

✅ Ejemplo conforme 2 — enum para estados relacionados

typedef enum {
    ESTADO_ABIERTO,
    ESTADO_CERRADO,
    ESTADO_SUSPENDIDO
} estado_t;
if (estado == ESTADO_ABIERTO) {
    /* ... */
}

El compilador puede detectar un nombre de estado inexistente, a diferencia de la cadena.

⚠️ Casos límite

Cómo detectarla

HerramientaComandoSeñal
gaffgaff check archivo.cReglas 0x010Fh y 0x300Dh.
Revisión manualLiterales repetidos con significado de dominio.

Checklist de autocontrol

Reglas relacionadas