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 0x0107h: Las macros #define deben nombrarse en MAYUSCULAS_SNAKE_CASE

Nomenclatura e identificadores (0x01XX)

Universidad Nacional de Río Negro

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 consecuenciaEfecto concreto
CompilaciónNinguna: el nombre no afecta la expansión.
Bug silenciosoSe cree que una macro es una función y se la pasa como argumento.
PrecedenciaSin paréntesis, la expansión cambia el resultado de la expresión.
LegibilidadNo se distingue qué nombres son reemplazos del preprocesador.
DepuraciónLa 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 1024

Por 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 * 2

Por 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 21

Justificació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

Cómo detectarla

HerramientaComandoSeñal
Revisión manual#define con nombre en minúsculas o camelCase.
gaffgaff check archivo.cReglas 0x0107h y 0x010Dh.
gccgcc -E archivo.cVer la expansión real de la macro.

Checklist de autocontrol

Reglas relacionadas