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 0x010Ah: Prohibición de identificadores con prefijos reservados para el compilador (__ o _[A-Z])

Nomenclatura e identificadores (0x01XX)

Universidad Nacional de Río Negro

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 consecuenciaEfecto concreto
CompilaciónRedefinición de una macro interna del compilador (§7.1.3).
Comportamiento indefinidoEl estándar reserva esos nombres y no garantiza nada.
PortabilidadUn nombre _Privado puede ser legítimo en un sistema y chocar en otro.
EnlazadoColisión con símbolos de libc que el enlazador resuelve a ciegas.
MantenibilidadEl 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);

#endif

Justificació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

Cómo detectarla

HerramientaComandoSeñal
gaffgaff check archivo.cReglas 0x010Ah y 0x010Ch.
grep`grep -nE '\b__\b_[A-Z]’ archivo.c`
Preprocesadorgcc -E archivo.cVer si un nombre reservado colisiona tras la expansión.

Checklist de autocontrol

Reglas relacionadas