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 0x2009h: Los nombres de funciones y procedimientos deben usar snake_case en minúsculas

Funciones, contratos y modularizacion (0x20XX)

Universidad Nacional de Río Negro

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 usarse camelCase, PascalCase ni 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 consecuenciaEfecto concreto
EnlazadoDefinir Calcular y llamar calcular produce “undefined reference”.
LegibilidadNo se distingue función de tipo ni de constante.
ConsistenciaEl mismo proyecto mezcla tres convenciones distintas.
PortabilidadAlgunos 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

Cómo detectarla

HerramientaComandoSeñal
gaffgaff check archivo.cIdentificador de función con mayúsculas o sin guiones.
grep`grep -nE "(intvoid
gccgcc ... && nm a.outSímbolos con ortografía inconsistente.

Checklist de autocontrol

Reglas relacionadas