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 0x0106h: Las variables globales deben ser declaradas como static o usar prefijo g_

Nomenclatura e identificadores (0x01XX)

Universidad Nacional de Río Negro

0x0106h: Las variables globales deben ser declaradas como static o usar prefijo g_

Enunciado normativo

DEBE restringirse las variables con alcance de archivo mediante static o, si necesitan enlace externo, nombrarse con el prefijo g_. NO DEBE dejarse una global mutable sin marca que advierta del acoplamiento.

El objetivo es hacer visible el estado compartido.

¿Por qué existe esta regla?

El problema

Una variable global mutable puede ser modificada desde cualquier función del programa. Rastrear quién cambió su valor es una tarea de arqueología: hay que leer todo el proyecto. Esa es la razón por la que la cátedra prohíbe las globales mutables (0x2004h: No se permite el uso de variables globales); esta regla gobierna el caso excepcional en que una global sea inevitable.

La marca no elimina el acoplamiento, pero lo hace visible: static limita el alcance al archivo (enlace interno) y elimina la posibilidad de que otro módulo la toque; el prefijo g_ advierte que la variable cruza módulos.

Consecuencias de violarla

Tipo de consecuenciaEfecto concreto
CompilaciónNinguna: una global sin static compila igual.
Bug silenciosoOtra unidad de traducción modifica el estado y rompe invariantes.
MantenibilidadNo se sabe cuántas funciones dependen del valor.
TestingLas pruebas comparten estado entre casos y se contaminan.
EnlazadoDos archivos con el mismo nombre de global colisionan.

Fundamento en el estándar y en la cátedra

El estándar distingue variables de enlace externo de las de enlace interno (§6.2.2, §6.2.4). static en el ámbito de archivo otorga enlace interno. La cátedra adopta static como opción preferida y reserva g_ para el caso excepcional de una global exportada.

Alcance y excepciones

Aplica a variables con alcance de archivo, tanto mutables como const. Las constantes de archivo se rigen además por 0x0103h: Las constantes (const o #define) deben nombrarse en MAYUSCULAS_SNAKE_CASE; si son static const, el prefijo g_ puede omitirse porque son inmutables. Las variables locales no se ven alcanzadas.

Ejemplos exhaustivos

❌ Contraejemplo 1 — Global mutable sin marca

int total_acumulado = 0;

Por qué falla: cualquier módulo puede enlazarla y modificarla; el nombre no advierta nada y el lector no sabe que hay estado compartido.

❌ Contraejemplo 2 — Estado de módulo expuesto sin necesidad

int contador_llamadas = 0;

void registrar_llamada(void)
{
    contador_llamadas++;
}

Por qué falla: si solo registrar_llamada la usa, no hay razón para exportarla; debería ser static y quedar encapsulada.

✅ Ejemplo conforme 1 — Enlace interno

static int contador_llamadas = 0;

void registrar_llamada(void)
{
    contador_llamadas++;
}

Justificación: static confina la variable al archivo, de modo que ningún otro módulo puede modificarla; el estado compartido se reduce al módulo.

✅ Ejemplo conforme 2 — Global exportada con prefijo

// configuracion.h
extern int g_nivel_verbosidad;

// configuracion.c
int g_nivel_verbosidad = 1;

Justificación: cuando el estado debe cruzar módulos, el prefijo g_ lo delata en cada uso y obliga a revisar con cuidado cada acceso.

⚠️ Casos límite

Cómo detectarla

HerramientaComandoSeñal
Revisión manualVariables fuera de funciones sin static ni prefijo g_.
gaffgaff check archivo.cRegla 0x0106h: global sin static ni g_.
nmnm modulo.o | grep ' B | D 'Símbolos en la sección de datos con enlace externo.

Checklist de autocontrol

Reglas relacionadas