Regla 0x2009h: Los nombres de funciones y procedimientos deben usar snake_case en minúsculas
Funciones, contratos y modularizacion (0x20XX)
0x2009h: Los nombres de funciones y procedimientos deben usar snake_case en minúsculas¶
Enunciado normativo¶
DEBEN escribirse los nombres de funciones en
snake_case, todo en minúsculas, con palabras separadas por guión bajo. NO DEBE usarsecamelCase,PascalCaseni mayúsculas sueltas.
¿Por qué existe esta regla?¶
El problema¶
En C existen varios “espacios de nombres” que se distinguen por convención. Si
funciones, tipos y constantes se escriben con el mismo patrón, el lector no
puede saber de un vistazo qué es cada identificador. Al reservar las mayúsculas
para las constantes y macros (0x0107h: Las macros #define deben nombrarse en MAYUSCULAS_SNAKE_CASE) y el sufijo _t para los tipos
(0x3004h: Utilizá typedef para definir tipos de estructuras con el sufijo _t), el snake_case en minúsculas identifica de inmediato una
función.
Además, C es sensible a mayúsculas: CalcularTotal, calcularTotal y
calculartotal son tres símbolos distintos. Si cada estudiante elige una forma,
el enlazador puede encontrar funciones “parecidas” pero no iguales y fallar con
un error de símbolo indefinido difícil de leer.
Consecuencias de violarla¶
| Tipo de consecuencia | Efecto concreto |
|---|---|
| Enlazado | Definir Calcular y llamar calcular produce “undefined reference”. |
| Legibilidad | No se distingue función de tipo ni de constante. |
| Consistencia | El mismo proyecto mezcla tres convenciones distintas. |
| Portabilidad | Algunos entornos son case-insensitive y confunden identificadores. |
Fundamento en el estándar y en la cátedra¶
C11 distingue identificadores por su ortografía exacta (§6.2.1 y §6.2.2) y reserva los que empiezan con guión bajo y mayúscula (§7.1.3). El estándar no impone una convención, así que la cátedra elige la más extendida en el ecosistema C y en su propio catálogo. La regla 0x0105h: Los nombres de funciones deben usar snake_case estricto en minúsculas formula la misma exigencia desde el bloque de sintaxis; 0x2009h: Los nombres de funciones y procedimientos deben usar snake_case en minúsculas la ancla en el bloque de funciones, junto con 0x0102h: Los argumentos de función y las variables locales deben usar snake_case en minúsculas (variables) y 0x2003h: Todas las funciones deben incluir documentación completa y estructurada (contratos).
Alcance y excepciones¶
Aplica a nombres de funciones públicas y auxiliares, incluidas las static, y
a los nombres de los parámetros. No cambia los nombres de tipos (sufijo _t,
0x3004h: Utilizá typedef para definir tipos de estructuras con el sufijo _t), ni de constantes (MAYÚSCULAS, 0x0107h: Las macros #define deben nombrarse en MAYUSCULAS_SNAKE_CASE), ni de la
función main, que tiene nombre impuesto por el estándar.
Excepción razonable: las funciones de la biblioteca estándar conservan su
nombre oficial (snake_case también, salvo memcpy, strlen, etc., que ya lo
son). No se “traducen” los identificadores a español ni se fuerzan acentos: los
nombres son ASCII (0x0108h: Prohibición de identificadores con caracteres no ASCII (acentos, ñ)).
Ejemplos exhaustivos¶
❌ Contraejemplo 1 — PascalCase y camelCase mezclados¶
int CalcularTotal(int base, int impuesto);
int calcularDescuento(int monto);
void Imprimir_Resultado(int total);Por qué falla: tres convenciones en tres líneas. El lector no sabe si
CalcularTotal es una función, un tipo o una constante, y el riesgo de error
de tipeo en mayúsculas crece.
❌ Contraejemplo 2 — Mayúsculas que parecen macro¶
int OBTENER_MAXIMO(const int v[], size_t n);Por qué falla: OBTENER_MAXIMO en mayúsculas se confunde con una constante o
macro. Peor: si existe #define OBTENER_MAXIMO ..., el preprocesador lo
reemplaza y la función desaparece antes de compilar.
✅ Ejemplo conforme 1 — Firma consistente¶
int calcular_total(int base, int impuesto);
int calcular_descuento(int monto);
void imprimir_resultado(int total);Todos los nombres comparten el mismo patrón, y los parámetros también. El
prefijo verbal (calcular_, imprimir_) hace previsible qué hace cada
función.
✅ Ejemplo conforme 2 — Auxiliares y tipos bien diferenciados¶
struct pedido_t {
int unidades;
int precio;
};
static bool pedido_valido(const struct pedido_t *p);
int total_pedido(const struct pedido_t *p)
{
if (pedido_valido(p) == false) {
return 0;
}
return p->unidades * p->precio;
}struct pedido_t usa el sufijo de tipo, pedido_valido y total_pedido usan
snake_case. Cada clase de identificador se reconoce por su forma.
⚠️ Casos límite¶
Abreviaturas: por convención se escriben en minúsculas (
obtener_html,calcular_iva), no como siglas en mayúscula.Palabras reservadas: un nombre nunca puede coincidir con una palabra clave ni con un tipo estándar (0x0109h: Prohibición de identificadores que colisionen con palabras clave o tipos estándar).
Prefijos reservados: no empieces un identificador con
_seguido de mayúscula ni con__(0x010Ah: Prohibición de identificadores con prefijos reservados para el compilador (__ o _[A-Z])).
Cómo detectarla¶
| Herramienta | Comando | Señal |
|---|---|---|
gaff | gaff check archivo.c | Identificador de función con mayúsculas o sin guiones. |
grep | `grep -nE "(int | void |
gcc | gcc ... && nm a.out | Símbolos con ortografía inconsistente. |
Checklist de autocontrol¶
¿Todos los nombres de funciones están en minúsculas?
¿Separé las palabras con
_?¿Distingo funciones (
snake_case) de tipos (_t) y constantes (MAYÚSCULAS)?¿Evité colisiones con palabras clave y prefijos reservados?
Reglas relacionadas¶
0x0105h: Los nombres de funciones deben usar snake_case estricto en minúsculas — misma exigencia desde la sintaxis; refuerza la consistencia.
0x0102h: Los argumentos de función y las variables locales deben usar snake_case en minúsculas — los parámetros y variables también usan
snake_case.0x3004h: Utilizá typedef para definir tipos de estructuras con el sufijo _t — los tipos se distinguen con el sufijo
_t.0x0108h: Prohibición de identificadores con caracteres no ASCII (acentos, ñ) — los identificadores se limitan a ASCII.