Regla 0x0107h: Las macros #define deben nombrarse en MAYUSCULAS_SNAKE_CASE
Nomenclatura e identificadores (0x01XX)
0x0107h: Las macros #define deben nombrarse en MAYUSCULAS_SNAKE_CASE¶
Enunciado normativo¶
DEBE nombrarse toda macro de preprocesador en
MAYUSCULAS_SNAKE_CASE. NO DEBE usarse minúsculas para una macro, sea de valor o de función.
La convención distingue las macros de las funciones y variables reales.
¿Por qué existe esta regla?¶
El problema¶
Una macro no es una función ni una variable: no tiene tipo, no ocupa memoria y su expansión es textual. Confundirla con un identificador ordinario es peligroso porque sus efectos pueden ser sorpresivos (precedencia, doble evaluación). Las mayúsculas son la única señal visual de que ese nombre va a ser reemplazado por el preprocesador.
El catálogo separa esta regla de 0x0103h: Las constantes (const o #define) deben nombrarse en MAYUSCULAS_SNAKE_CASE (constantes const) porque
las macros tienen reglas adicionales de protección: paréntesis envolventes
(0x5013h: Protección obligatoria con paréntesis envolventes en expresiones de macroconstantes (#define)), parámetros protegidos (0x500Ah: Protección obligatoria de parámetros en macros funcionales mediante paréntesis) y no redefinir
palabras clave (0x500Dh: Prohibición de redefinir palabras clave o tipos primitivos de C con #define).
Consecuencias de violarla¶
| Tipo de consecuencia | Efecto concreto |
|---|---|
| Compilación | Ninguna: el nombre no afecta la expansión. |
| Bug silencioso | Se cree que una macro es una función y se la pasa como argumento. |
| Precedencia | Sin paréntesis, la expansión cambia el resultado de la expresión. |
| Legibilidad | No se distingue qué nombres son reemplazos del preprocesador. |
| Depuración | La macro desaparece antes del binario y el gdb no la ve. |
Fundamento en el estándar y en la cátedra¶
El estándar define el reemplazo textual de las macros (§6.10.3) y no impone
nomenclatura. La cátedra adopta MAYUSCULAS_SNAKE_CASE para que toda macro
sea visible como tal y para reforzar la separación entre preprocesador y
código C.
Alcance y excepciones¶
Cubre macros de objeto (#define BUFFER_MAX 1024) y de función
(#define CUADRADO(x) ((x) * (x))). Las macroguardas de cabecera siguen la
misma convención, derivada del nombre del archivo. __FILE__ y __LINE__
son predefinidas del compilador y no se renombran.
Ejemplos exhaustivos¶
❌ Contraejemplo 1 — Macro de valor en minúsculas¶
#define buffer_max 1024Por qué falla: buffer_max parece una variable; el lector puede intentar
tomar su dirección o depurarla, cosas que una macro no permite.
❌ Contraejemplo 2 — Macro de función en camelCase¶
#define calcularDoble(x) x * 2Por qué falla: parece una función y no lo es; además le falta la protección
de paréntesis (0x500Ah: Protección obligatoria de parámetros en macros funcionales mediante paréntesis, 0x5013h: Protección obligatoria con paréntesis envolventes en expresiones de macroconstantes (#define)), que la vuelve incorrecta para
valores como calcularDoble(1 + 2).
✅ Ejemplo conforme 1 — Macro de valor¶
#define BUFFER_MAX 1024
#define ALICUOTA_IVA 21Justificación: el nombre en mayúsculas anuncia que es un reemplazo del preprocesador y su significado es evidente.
✅ Ejemplo conforme 2 — Macro de función protegida¶
#define CUADRADO(x) ((x) * (x))
#define MAXIMO(a, b) ((a) > (b) ? (a) : (b))Justificación: mayúsculas para identificar la macro y paréntesis envolventes para que la expansión respete la precedencia en cualquier contexto.
⚠️ Casos límite¶
Macroguardas:
#ifndef MI_MODULO_Hdebe coincidir con el nombre del archivo en mayúsculas; ver 0x5003h: Utilizá guardas de inclusión en todos los archivos de cabecera y 0x500Fh: Colisión de nombres de macroguardas entre archivos de cabecera distintos.Macros con prefijo de módulo:
PILA_MAXes preferible aMAXpara evitar colisiones entre cabeceras.Alternativas a la macro: para valores,
constoenumevitan los problemas del preprocesador (0x300Dh: Utilizá enum en lugar de ‘números mágicos’ para conjuntos de estados y valores constantes).
Cómo detectarla¶
| Herramienta | Comando | Señal |
|---|---|---|
| Revisión manual | — | #define con nombre en minúsculas o camelCase. |
gaff | gaff check archivo.c | Reglas 0x0107h y 0x010Dh. |
gcc | gcc -E archivo.c | Ver la expansión real de la macro. |
Checklist de autocontrol¶
¿Todas mis macros están en mayúsculas con guiones bajos?
¿Protegí los parámetros y el cuerpo con paréntesis?
¿Evité redefinir palabras clave o tipos?
¿Usé
constoenumcuando la macro no era necesaria?
Reglas relacionadas¶
0x0103h: Las constantes (const o #define) deben nombrarse en MAYUSCULAS_SNAKE_CASE — constantes
constenMAYUSCULAS_SNAKE_CASE.0x010Dh: Auditor de consistencia en nombres de constantes simbólicas — consistencia en nombres de constantes simbólicas.
0x5013h: Protección obligatoria con paréntesis envolventes en expresiones de macroconstantes (#define) — paréntesis envolventes en macroconstantes.
0x500Ah: Protección obligatoria de parámetros en macros funcionales mediante paréntesis — protección de parámetros en macros funcionales.
0x500Dh: Prohibición de redefinir palabras clave o tipos primitivos de C con #define — no redefinir palabras clave con
#define.