Hai scritto funzioni che funzionano. Il generatore rand e l’algoritmo bubble_sort sono solidi. Adesso ne hai bisogno altrove. Il codice copia-incolla è complicato. Crea bug. Rende la manutenzione un incubo.
La soluzione è una libreria di utilità.
In C, una libreria non è una scatola magica. Si tratta di due file specifici che lavorano insieme: un’intestazione (.h ) e una sorgente (.c ). L’intestazione indica al compilatore cosa è disponibile. Il file sorgente contiene la logica effettiva.
Ecco come strutturare una libreria C di base per mantenere il codice pulito e modulare.
Definizione dell’interfaccia
Ogni funzione pubblica necessita di una dichiarazione. Questo risiede nel file di intestazione.
Creare un file denominato util.h.
Quelle linee sono prototipi di funzioni. La parola chiave “extern” è importante. Dice al compilatore: “Questa funzione esiste, ma non so ancora dove. La troverò più tardi durante il collegamento.”
Se stai utilizzando un compilatore C molto vecchio stile, potresti dover rimuovere i nomi dei parametri da “bubble_sort”. Gli standard moderni preferiscono prototipi completi, ma il codice legacy spesso li elimina.
Implementazione della logica
Ora passiamo al lavoro pesante. Crea util.c.
Notare l’inclusione. Si utilizzano le virgolette ("util.h" ) invece delle parentesi angolari ( ). Le parentesi angolari sono riservate alle librerie di sistema trovate nelle directory standard. Le virgolette dicono al compilatore di cercare nella directory corrente.
C’è una sottile funzionalità di sicurezza qui. La variabile “rand_seed” è definita nel file “.c” ma non nel file “.h”. Questo è nascondere informazioni.
I programmi che includono util.h conoscono rand(). Non conoscono rand_seed. Non possono modificare accidentalmente il seme. Se vuoi applicarlo in modo rigoroso, puoi aggiungere la parola chiave “static” prima di “int rand_seed”. Ciò rende la variabile visibile solo all’interno di questo singolo file.
Utilizzo della Biblioteca
Il tuo programma principale non necessita di implementazione. Ha solo bisogno dell’interfaccia.
Crea main.c.
Il beneficio è immediato. La logica principale è più breve. Non ingombrare il codice primario con algoritmi di ordinamento o generatori di numeri casuali. Li chiami e basta.
Compilazione e collegamento
È qui che inciampa la maggior parte dei principianti. Non è possibile compilare tutto in una volta se si desiderano file oggetto separati. Devi compilare separatamente, quindi collegare.
Supponendo che tu stia utilizzando un sistema simile a UNIX, ecco il flusso di lavoro.
Innanzitutto, compila il sorgente della libreria in un file oggetto.
“bash.”
gcc -c -g util.c
Questo produce main.o. Ancora una volta, questo è solo codice macchina. Non è ancora un eseguibile.
Infine, collegali insieme.
“bash.”
gcc -o main main.o util.o
Vedrai un elenco di dieci numeri casuali, seguito da un trattino separatore, seguito dall’elenco ordinato.
Perché è importante
Potresti chiederti: perché preoccuparsi di questo passaggio aggiuntivo? Perché non incollare semplicemente le funzioni in main.c?
Perché le biblioteche crescono. Man mano che i tuoi progetti crescono, avrai dozzine di funzioni di utilità. Conservarli in file separati consente di riutilizzarli in progetti diversi



















