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 0x0109h: Prohibición de identificadores que colisionen con palabras clave o tipos estándar

Nomenclatura e identificadores (0x01XX)

Universidad Nacional de Río Negro

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, nullptr y alignas.

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 consecuenciaEfecto concreto
Compilaciónint inline = 3; es un error de sintaxis directo.
Preprocesadorint true = 1; puede expandirse a int 1 = 1; si true es macro.
SemánticaRedefinir bool rompe las comparaciones booleanas del proyecto.
PortabilidadUn nombre reservado en C23 compila hoy y falla mañana.
MantenibilidadEl 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

Cómo detectarla

HerramientaComandoSeñal
gcc / clanggcc -Wall -Wextra -std=c11 -pedanticerror: expected identifier o redeclaration.
gaffgaff check archivo.cRegla 0x0109h: identificador reservado.
grepgrep -nwE 'inline|restrict|alignas|nullptr' archivo.cNombres sospechosos.

Checklist de autocontrol

Reglas relacionadas