Regla 0x0108h: Prohibición de identificadores con caracteres no ASCII (acentos, ñ)
Nomenclatura e identificadores (0x01XX)
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 consecuencia | Efecto concreto |
|---|---|
| Compilación | gcc moderno puede aceptarlo; otros compiladores o locales no. |
| Portabilidad | El mismo fuente deja de compilar en entornos con otra codificación. |
| Herramientas | gdb, grep y los scripts de análisis fallan al tratar bytes no ASCII. |
| Enlazado | Los símbolos generados dependen de la codificación del compilador. |
| Legibilidad | Un 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¶
Tildes en comentarios: permitidas; son texto, no identificadores.
Transliteración estándar:
a -> a,n -> n,u -> u; evitá omitir letras (agnoes peor queanio).Caracteres invisibles: espacios de ancho cero o BOM al inicio del archivo también son no ASCII y deben eliminarse.
Cómo detectarla¶
| Herramienta | Comando | Señal |
|---|---|---|
grep | grep -nP '[^\x00-\x7F]' archivo.c | Bytes no ASCII (revisar si son código o texto). |
gaff | gaff check archivo.c | Regla 0x0108h: identificador no ASCII. |
file | file archivo.c | Codificación detectada del archivo fuente. |
Checklist de autocontrol¶
¿Todos los identificadores son ASCII?
¿Transliteré tildes y
ñsin omitir letras?¿El UTF-8 quedó solo en cadenas y comentarios?
¿Eliminé BOM y caracteres invisibles?
Reglas relacionadas¶
0x0102h: Los argumentos de función y las variables locales deben usar snake_case en minúsculas — variables y argumentos en
snake_case.0x0105h: Los nombres de funciones deben usar snake_case estricto en minúsculas — funciones en
snake_case.0x0104h: Los nombres de los archivos deben usar snake_case en minúsculas (sin espacios) — nombres de archivo sin caracteres especiales.
0x010Ah: Prohibición de identificadores con prefijos reservados para el compilador (__ o _[A-Z]) — prefijos reservados del compilador.
0x0101h: Los identificadores deben ser descriptivos — nombres descriptivos, siempre en ASCII.