Regla 0x0109h: Prohibición de identificadores que colisionen con palabras clave o tipos estándar
Nomenclatura e identificadores (0x01XX)
0x0109h: Prohibición de identificadores que colisionen con palabras clave o tipos estándar¶
Enunciado normativo¶
NO DEBE usarse como nombre de variable, parámetro o campo ninguna palabra clave de C99/C11 ni ningún identificador de tipo estándar, incluidos
restrict,inline,bool,true,false,nullptryalignas.
La colisión puede ser sintáctica o semántica.
¿Por qué existe esta regla?¶
El problema¶
Las palabras clave están reservadas por el lenguaje (§6.4.1): usarlas como
identificador produce un error de compilación. Pero hay casos más sutiles:
bool, true y false no son palabras clave de C, sino macros de
<stdbool.h> (§7.18). Redefinirlas no da error inmediato, pero cambia el
significado de todo el código que incluye esa cabecera.
nullptr y alignas provienen de C23/otros lenguajes; aunque C11 no las
reserve, usarlas ata el código a una versión y confunde a quien viene de C++.
Consecuencias de violarla¶
| Tipo de consecuencia | Efecto concreto |
|---|---|
| Compilación | int inline = 3; es un error de sintaxis directo. |
| Preprocesador | int true = 1; puede expandirse a int 1 = 1; si true es macro. |
| Semántica | Redefinir bool rompe las comparaciones booleanas del proyecto. |
| Portabilidad | Un nombre reservado en C23 compila hoy y falla mañana. |
| Mantenibilidad | El lector duda de si el identificador es propio o del lenguaje. |
Fundamento en el estándar y en la cátedra¶
El estándar reserva las palabras clave (§6.4.1) y los identificadores de
cabecera (§7.1.3), y define bool/true/false como macros en
<stdbool.h> (§7.18). La cátedra prohíbe cualquier colisión para mantener el
código ajeno a la versión del estándar y evitar redefiniciones peligrosas.
Alcance y excepciones¶
Cubre variables, parámetros, campos de struct, etiquetas y macros. No alcanza
a cadenas literales ni a comentarios. El uso correcto de bool, true y
false como el tipo estándar (con #include <stdbool.h>) sí está permitido
y es la forma recomendada (0x301Ah: Validador de uso idiomático de tipos booleanos estándar).
Ejemplos exhaustivos¶
❌ Contraejemplo 1 — Palabras clave como variables¶
int inline = 3;
int restrict = 0;Por qué falla: ambas son palabras clave reservadas por C11 (§6.4.1); el compilador rechaza la declaración con un error de sintaxis.
❌ Contraejemplo 2 — Redefinir los booleanos estándar¶
#include <stdbool.h>
int bool = 1;
int true = 0;Por qué falla: bool y true son macros de <stdbool.h> (§7.18); la
segunda declaración se expande y produce una construcción inválida, además
de romper todo el código que usa el tipo booleano.
✅ Ejemplo conforme 1 — Nombres propios¶
bool es_valido = true;
int limite = 10;Justificación: bool y true se usan con su significado estándar y los
nombres propios (es_valido, limite) no pisan nada del lenguaje.
✅ Ejemplo conforme 2 — Evitar nombres de la biblioteca¶
size_t longitud_texto = strlen(texto);
int indice_actual = 0;Justificación: size_t se usa como tipo y no se redefine; indice_actual
no colisiona con ningún identificador estándar.
⚠️ Casos límite¶
nullptr: no es palabra clave de C11, pero sí de C23; la cátedra prefiereNULLpara no atarse a una versión.Nombres de funciones POSIX:
index,timeoy0pueden colisionar con la biblioteca; se evitan aunque no sean palabras clave._Bool: es la palabra clave real;booles su alias por cabecera.
Cómo detectarla¶
| Herramienta | Comando | Señal |
|---|---|---|
gcc / clang | gcc -Wall -Wextra -std=c11 -pedantic | error: expected identifier o redeclaration. |
gaff | gaff check archivo.c | Regla 0x0109h: identificador reservado. |
grep | grep -nwE 'inline|restrict|alignas|nullptr' archivo.c | Nombres sospechosos. |
Checklist de autocontrol¶
¿Algún nombre coincide con una palabra clave de C11?
¿Evité redefinir
bool,trueofalse?¿Evité
nullptryalignas?¿Consulté si el nombre choca con la biblioteca estándar?
Reglas relacionadas¶
0x010Ah: Prohibición de identificadores con prefijos reservados para el compilador (__ o _[A-Z]) — prefijos reservados para el compilador (
__,_A).0x0108h: Prohibición de identificadores con caracteres no ASCII (acentos, ñ) — identificadores restringidos a ASCII.
0x301Ah: Validador de uso idiomático de tipos booleanos estándar — uso idiomático de
bool,trueyfalse.0x500Dh: Prohibición de redefinir palabras clave o tipos primitivos de C con #define — prohibición de redefinir palabras clave con
#define.0x0101h: Los identificadores deben ser descriptivos — nombres propios y descriptivos, sin colisiones.