En el lenguaje C se distingue entre declaración (declaration) y definición (definition).
Ejemplos:
// Declaración (extern) extern int global_var; int func(int); // Definición int global_var = 42; int func(int x) { return x * 2; }
En un proyecto multimódulo, las declaraciones se colocan en archivos de cabecera para que los módulos "conozcan entre sí", y las definiciones solo en un archivo de origen, para evitar conflictos durante la vinculación.
¿Puede haber múltiples definiciones de la misma variable (por ejemplo, int flag = 0;) en diferentes archivos de origen si incluyen el mismo archivo de cabecera?
Respuesta: ¡No! El archivo de cabecera debe contener solo la declaración extern int flag;, y la definición de la variable debe estar solo en un archivo de origen (int flag = 0;). No cumplir con esto resultará en un error de vinculación por definición múltiple.
Historia
En un gran proyecto, “dividieron” las variables globales en archivos de cabecera como
int counter = 0;. Incluyeron este encabezado mediante include, lo que provocó la duplicación de la definición. Resultado: error del enlazador al construir CI/CD — “multiple definition of counter”.
Historia
En una biblioteca de funciones, hicieron prototipos de funciones sin especificar tipos, lo que el compilador ralentizó como declaración obsoleta, y luego dio error por discrepancias en las firmas de las funciones entre los módulos.
Historia
En la etapa de prueba, se descubrió que algunas variables no se inicializaban, ya que se habían declarado solo como
extern, pero no había inicialización en ninguno de los módulos. Esto llevó a la lectura de basura y a errores difíciles de detectar en una plataforma embebida.