Regla 0x0106h: Las variables globales deben ser declaradas como static o usar prefijo g_
Nomenclatura e identificadores (0x01XX)
0x0106h: Las variables globales deben ser declaradas como static o usar prefijo g_¶
Enunciado normativo¶
DEBE restringirse las variables con alcance de archivo mediante
statico, si necesitan enlace externo, nombrarse con el prefijog_. 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 consecuencia | Efecto concreto |
|---|---|
| Compilación | Ninguna: una global sin static compila igual. |
| Bug silencioso | Otra unidad de traducción modifica el estado y rompe invariantes. |
| Mantenibilidad | No se sabe cuántas funciones dependen del valor. |
| Testing | Las pruebas comparten estado entre casos y se contaminan. |
| Enlazado | Dos 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¶
static const: no necesita prefijog_; es inmutable y de archivo.Estado de depuración: un contador de instrumentación también es global; aunque sea inmutable en la práctica, conviene documentarlo.
Variables de bibliotecas:
errnoes una global del sistema; se usa según 0x4003h: Utilizá errno, perror y strerror para reportar fallos del sistema operativo de manera precisa, no se redefine.
Cómo detectarla¶
| Herramienta | Comando | Señal |
|---|---|---|
| Revisión manual | — | Variables fuera de funciones sin static ni prefijo g_. |
gaff | gaff check archivo.c | Regla 0x0106h: global sin static ni g_. |
nm | nm modulo.o | grep ' B | D ' | Símbolos en la sección de datos con enlace externo. |
Checklist de autocontrol¶
¿Toda variable de archivo es
static?Si debe exportarse, ¿lleva el prefijo
g_?¿Puedo eliminar el estado global y usar parámetros?
¿La global no viola 0x2004h: No se permite el uso de variables globales?
Reglas relacionadas¶
0x2004h: No se permite el uso de variables globales — prohibición general de variables globales mutables.
0x2006h: Mantené el alcance de las variables al mínimo posible — mantener el alcance de las variables al mínimo.
0x0103h: Las constantes (const o #define) deben nombrarse en MAYUSCULAS_SNAKE_CASE — nomenclatura de constantes de archivo.
0x301Dh: Diseñá los Tipos de Datos Abstractos utilizando punteros opacos — encapsular el estado dentro del TAD.
0x300Eh: Documentá explícitamente el comportamiento de las funciones al manejar punteros nulos como argumentos — documentar el contrato de las interfaces compartidas.