La declaración e inicialización de variables es la piedra angular del lenguaje C, con reglas muy estrictas y a veces no evidentes. La forma y el lugar donde declaras una variable afectará incluso su valor inicial (sobre la inicialización), así como la vinculación con un objeto en memoria (sobre la declaración y definición).
C se remonta a tiempos cuando la optimización de memoria era una prioridad. Los desarrolladores debían declarar e inicializar variables por sí mismos, de lo contrario, el comportamiento del programa se volvía impredecible. En los compiladores modernos de C, incluso una pequeña desviación puede provocar errores de enlace o una inicialización implícita con "basura".
Errores principales:
Ejemplo de código:
#include <stdio.h> int global_var; // definición, auto-inicialización = 0 static int static_global_var; // static-file, auto-inicialización = 0 extern int extern_var; // declaración, definición en otro lugar void foo() { int local_var; // automática, no inicializada -> basura static int static_local_var; // static, auto-inicializada en 0 }
Características clave:
1. ¿Las variables automáticas (locales sin static y extern) son inicializadas automáticamente en 0 por el compilador?
No, contienen basura. Su valor no está definido, usarlas antes de la inicialización — es un error.
2. ¿Se puede definir una variable con extern varias veces en diferentes archivos?
No, se necesita una definición única, las demás son declaraciones a través de extern, de lo contrario, el enlazador mostrará el error "multiple definition" o "undefined symbol".
3. ¿Cuál es la diferencia entre la declaración y la definición de una función?
La declaración — es solo un prototipo (sin cuerpo); la definición — debe contener obligatoriamente el cuerpo de la función. Para variables, la declaración a través de extern no reserva memoria, mientras que para funciones ambas formas son permitidas.
Se declara una variable global int counter; en dos archivos de cabecera. El proyecto se enlazó con el error de definición múltiple.
Ventajas:
Desventajas:
En el encabezado se escribe extern int counter;, la definición int counter = 0; — solo en un archivo C.
Ventajas:
Desventajas: