Regla 0x010Ah: Prohibición de identificadores con prefijos reservados para el compilador (__ o _[A-Z])
Nomenclatura e identificadores (0x01XX)
0x010Ah: Prohibición de identificadores con prefijos reservados para el compilador (__ o _[A-Z])¶
Enunciado normativo¶
NO DEBE usarse ningún identificador que comience con doble guion bajo (
__nombre) ni con guion bajo seguido de mayúscula (_Nombre). Esos prefijos están reservados para la implementación y la biblioteca estándar.
La prohibición alcanza también a los nombres de archivo y a las macroguardas.
¿Por qué existe esta regla?¶
El problema¶
La implementación reserva ciertos identificadores para su uso interno
(§7.1.3). Si el programa define __valor, puede chocar con una macro o una
variable interna de glibc, del compilador o de otra cabecera, y el
resultado es un comportamiento impredecible que aparece o desaparece según la
versión del sistema.
Además, el guion bajo inicial seguido de mayúscula es una convención que señala “esto es del sistema”. Usarla para código propio rompe esa señal y confunde a cualquier lector.
Consecuencias de violarla¶
| Tipo de consecuencia | Efecto concreto |
|---|---|
| Compilación | Redefinición de una macro interna del compilador (§7.1.3). |
| Comportamiento indefinido | El estándar reserva esos nombres y no garantiza nada. |
| Portabilidad | Un nombre _Privado puede ser legítimo en un sistema y chocar en otro. |
| Enlazado | Colisión con símbolos de libc que el enlazador resuelve a ciegas. |
| Mantenibilidad | El nombre sugiere que pertenece al sistema cuando es del proyecto. |
Fundamento en el estándar y en la cátedra¶
El estándar reserva todos los identificadores que comienzan con guion bajo y mayúscula, o con doble guion bajo, para cualquier uso de la implementación (§7.1.3). La cátedra prohíbe usarlos para evitar colisiones y enseñar el límite entre el código propio y el del sistema.
Alcance y excepciones¶
Aplica a variables, funciones, tipos, campos, macros y macroguardas. La
biblioteca estándar sí usa _Bool, __FILE__, _Static_assert, etc.; esos
nombres se usan, no se redefinen. Los nombres provistos por el sistema no
se consideran violación.
Ejemplos exhaustivos¶
❌ Contraejemplo 1 — Doble guion bajo¶
int __valor = 10;Por qué falla: __valor pertenece al espacio reservado para la
implementación (§7.1.3); cualquier cabecera podría definir algo con ese
nombre y provocar una redefinición.
❌ Contraejemplo 2 — Guion bajo y mayúscula¶
int _Privado = 5;
void _Procesar(void);Por qué falla: _Privado y _Procesar imitan la convención del sistema;
además 0x0102h: Los argumentos de función y las variables locales deben usar snake_case en minúsculas y 0x0105h: Los nombres de funciones deben usar snake_case estricto en minúsculas exigen minúsculas.
✅ Ejemplo conforme 1 — Nombre propio sin reserva¶
static int valor_interno = 10;Justificación: valor_interno usa snake_case, no arranca con guion bajo ni
colisiona con el espacio reservado.
✅ Ejemplo conforme 2 — Macroguarda correcta¶
#ifndef MI_MODULO_H
#define MI_MODULO_H
int procesar_entrada(int x);
#endifJustificación: la guarda se deriva del nombre del archivo en mayúsculas y no usa el guion bajo inicial; ver 0x5003h: Utilizá guardas de inclusión en todos los archivos de cabecera y 0x500Fh: Colisión de nombres de macroguardas entre archivos de cabecera distintos.
⚠️ Casos límite¶
_tal final: el sufijo_tlo reserva POSIX, pero la cátedra lo adopta para typedefs (0x3004h: Utilizá typedef para definir tipos de estructuras con el sufijo _t); el riesgo es bajo y aceptado.__func__: es una variable predefinida del estándar (§6.4.2.2) y se puede leer, nunca declarar.Un guion bajo solo:
_como nombre de variable no está reservado, pero es un nombre pésimo; se evita por 0x0101h: Los identificadores deben ser descriptivos.
Cómo detectarla¶
| Herramienta | Comando | Señal |
|---|---|---|
gaff | gaff check archivo.c | Reglas 0x010Ah y 0x010Ch. |
grep | `grep -nE '\b__ | \b_[A-Z]’ archivo.c` |
| Preprocesador | gcc -E archivo.c | Ver si un nombre reservado colisiona tras la expansión. |
Checklist de autocontrol¶
¿Ningún identificador empieza con
__?¿Ningún identificador empieza con
_seguido de mayúscula?¿Las macroguardas siguen la convención del archivo?
¿Usé nombres del sistema solo como lectura, sin redefinirlos?
Reglas relacionadas¶
0x010Ch: Auditor de identificadores reservados con doble guion bajo o guion bajo inicial — auditoría de identificadores reservados con guion bajo.
0x0109h: Prohibición de identificadores que colisionen con palabras clave o tipos estándar — colisión con palabras clave y tipos estándar.
0x0108h: Prohibición de identificadores con caracteres no ASCII (acentos, ñ) — identificadores restringidos a ASCII.
0x5003h: Utilizá guardas de inclusión en todos los archivos de cabecera — guardas de inclusión en cabeceras.
0x500Fh: Colisión de nombres de macroguardas entre archivos de cabecera distintos — colisión de macroguardas entre archivos.