Has escrito funciones que funcionan. El generador rand y el algoritmo bubble_sort son sólidos. Ahora los necesitas en otro lugar. Copiar y pegar código es complicado. Crea errores. Hace que el mantenimiento sea una pesadilla.
La solución es una biblioteca de utilidades.
En C, una biblioteca no es una caja mágica. Son dos archivos específicos que trabajan juntos: un encabezado (.h ) y una fuente (.c ). El encabezado le dice al compilador qué está disponible. El archivo fuente contiene la lógica real.
Así es como estructura una biblioteca C básica para mantener su código limpio y modular.
Definiendo la interfaz
Toda función pública necesita una declaración. Esto se encuentra en el archivo de encabezado.
Cree un archivo llamado util.h.
Esas líneas son prototipos de funciones. La palabra clave “externa” es importante. Le dice al compilador: “Esta función existe, pero todavía no sé dónde. La encontraré más tarde durante la vinculación”.
Si está utilizando un compilador de C muy antiguo, es posible que deba eliminar los nombres de los parámetros de bubble_sort. Los estándares modernos prefieren prototipos completos, pero el código heredado a menudo los elimina.
Implementando la lógica
Ahora vamos con el trabajo pesado. Cree util.c.
Note la inclusión. Utilice comillas ("util.h" ) en lugar de corchetes angulares ( ). Los corchetes angulares están reservados para las bibliotecas del sistema que se encuentran en los directorios estándar. Las comillas le dicen al compilador que busque en el directorio actual.
Aquí hay una característica de seguridad sutil. La variable rand_seed está definida en el archivo .c pero no en el archivo .h. Esto es ocultar información.
Los programas que incluyen util.h conocen rand(). No conocen “rand_seed”. No pueden modificar accidentalmente la semilla. Si desea aplicar esto estrictamente, puede agregar la palabra clave “estática” antes de “int rand_seed”. Esto hace que la variable sea visible solo dentro de este único archivo.
Usando la biblioteca
Su programa principal no necesita implementación. Sólo necesita la interfaz.
Cree principal.c.
El beneficio es inmediato. La lógica principal es más corta. No satura su código principal con algoritmos de clasificación o generadores de números aleatorios. Simplemente llámalos.
Compilación y vinculación
Aquí es donde tropiezan la mayoría de los principiantes. No puede compilar todo a la vez si desea archivos objeto separados. Tienes que compilar por separado y luego vincular.
Suponiendo que esté en un sistema tipo UNIX, este es el flujo de trabajo.
Primero, compile el código fuente de la biblioteca en un archivo objeto.
El indicador -c le dice a GCC que compile pero no vincule. Se detiene después de crear el código de máquina. El indicador -g agrega símbolos de depuración, lo cual es útil si algo sale mal. El resultado es util.o. Este archivo contiene el código de máquina compilado para rand y bubble_sort. No puede ejecutarse por sí solo porque carece de una función “principal”.
A continuación, compila tu programa principal.
Esto produce main.o. Nuevamente, esto es sólo código de máquina. Aún no es un ejecutable.
Finalmente, vincúlelos.
Este comando toma main.o y util.o y los une en un único ejecutable llamado main.
Ejecútelo con:
Verá una lista de diez números aleatorios, seguidos de un separador de guiones y de la lista ordenada.
Por qué esto es importante
Quizás te preguntes: ¿por qué molestarse con este paso adicional? ¿Por qué no simplemente pegar las funciones en main.c?
Porque las bibliotecas escalan. A medida que tus proyectos crezcan, tendrás docenas de funciones de utilidad. Mantenerlos en archivos separados le permite reutilizarlos en diferentes proyectos.



















