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 0x0108h: Prohibición de identificadores con caracteres no ASCII (acentos, ñ)

Nomenclatura e identificadores (0x01XX)

Universidad Nacional de Río Negro

0x0108h: Prohibición de identificadores con caracteres no ASCII (acentos, ñ)

Enunciado normativo

DEBE restringirse los identificadores al conjunto ASCII [A-Za-z_][A-Za-z0-9_]*. NO DEBE incluirse tildes, ñ, ü ni ningún carácter no ASCII en nombres de variables, funciones, tipos o macros.

El texto narrativo y las cadenas literales sí pueden contener UTF-8.

¿Por qué existe esta regla?

El problema

El estándar C11 admite identificadores extendidos mediante nombres de caracteres universales (§6.4.2), pero el conjunto básico de caracteres de origen está limitado (§5.2.1) y las implementaciones difieren en cómo codifican los bytes no ASCII en el fuente. Un archivo guardado en UTF-8 con año como identificador puede compilar en una máquina y fallar en otra.

Además, los nombres con tildes son difíciles de tipear en teclados ajenos y de buscar con herramientas que asumen ASCII, como grep, gdb o los scripts de corrección.

Consecuencias de violarla

Tipo de consecuenciaEfecto concreto
Compilacióngcc moderno puede aceptarlo; otros compiladores o locales no.
PortabilidadEl mismo fuente deja de compilar en entornos con otra codificación.
Herramientasgdb, grep y los scripts de análisis fallan al tratar bytes no ASCII.
EnlazadoLos símbolos generados dependen de la codificación del compilador.
LegibilidadUn teclado sin ñ obliga a copiar y pegar el identificador.

Fundamento en el estándar y en la cátedra

El estándar permite identificadores con UCN pero deja el conjunto extendido a cada implementación (§6.4.2). La cátedra adopta el subconjunto ASCII como garantía de portabilidad entre GCC, Clang y distintos sistemas operativos, y para que el código pueda procesarse con herramientas POSIX.

Alcance y excepciones

Aplica únicamente a identificadores: variables, funciones, parámetros, tipos, campos, etiquetas y macros. No alcanza a las cadenas literales (printf("Año\n")), a los comentarios ni a la documentación, donde el español con tildes es correcto y esperado.

Ejemplos exhaustivos

❌ Contraejemplo 1 — Variables con tilde y ñ

int año = 2026;
float número = 3.14;

Por qué falla: año y número contienen bytes no ASCII en posiciones de identificador; el archivo depende de la codificación con la que se guardó.

❌ Contraejemplo 2 — Función con ñ

int calcular_tamaño(int *arreglo)
{
    return arreglo[0];
}

Por qué falla: tamaño mezcla ASCII y UTF-8; algunos compiladores lo aceptan como extensión, pero el símbolo en el binario ya no es portable ni buscable.

✅ Ejemplo conforme 1 — Identificadores transliterados

int anio = 2026;
float numero = 3.14;

Justificación: se reemplazan ñ y tildes por sus equivalentes ASCII (anio, numero), con lo que el identificador es válido en todo entorno.

✅ Ejemplo conforme 2 — UTF-8 solo en cadenas

int anio_actual = 2026;
printf("Año: %d\n", anio_actual);

Justificación: el nombre anio_actual es ASCII y el texto visible conserva la ñ dentro del literal, donde el estándar sí permite UTF-8.

⚠️ Casos límite

Cómo detectarla

HerramientaComandoSeñal
grepgrep -nP '[^\x00-\x7F]' archivo.cBytes no ASCII (revisar si son código o texto).
gaffgaff check archivo.cRegla 0x0108h: identificador no ASCII.
filefile archivo.cCodificación detectada del archivo fuente.

Checklist de autocontrol

Reglas relacionadas