Regla 0x0112h: Usá constantes simbólicas para todo literal con significado
Nomenclatura e identificadores (0x01XX)
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,constoenum). 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 consecuencia | Efecto concreto |
|---|---|
| Bug silencioso | Cambiar un literal en un lugar y olvidarlo en otro. |
| Lectura | El significado del número debe inferirse del contexto. |
| Consistencia | El mismo concepto usa valores distintos según el archivo. |
| Testing | No 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¶
Array de literales como datos: una tabla de senos o un alfabeto puede contener literales legítimos; se documenta.
Valores de una sola aparición: si el literal se usa una vez y es obvio por contexto, un comentario alcanza; el símbolo es preferible.
constvs#define: preferirconstcuando el tipo importe (por ejemploconst double PI = 3.14159;), y#definepara tamaños de arreglo en tiempo de compilación (0x5001h: Los arreglos estáticos deben ser creados con un tamaño fijo en tiempo de compilación).
Cómo detectarla¶
| Herramienta | Comando | Señal |
|---|---|---|
gaff | gaff check archivo.c | Reglas 0x010Fh y 0x300Dh. |
| Revisión manual | — | Literales repetidos con significado de dominio. |
Checklist de autocontrol¶
¿Cada literal repetido tiene un nombre simbólico?
¿El nombre está en
MAYUSCULAS_SNAKE_CASEsi es macro?¿Usé
enumpara conjuntos de estados?¿El literal autoexplicativo (
0,1,NULL) se justifica?
Reglas relacionadas¶
0x010Fh: Prohibición de constantes numéricas mágicas en índices de arreglos — índices de arreglo sin números mágicos.
0x300Dh: Utilizá enum en lugar de ‘números mágicos’ para conjuntos de estados y valores constantes —
enumpara estados.0x0103h: Las constantes (const o #define) deben nombrarse en MAYUSCULAS_SNAKE_CASE — nomenclatura de constantes.
0x5001h: Los arreglos estáticos deben ser creados con un tamaño fijo en tiempo de compilación — tamaño de arreglos en tiempo de compilación.