I programmi C visti fino ad ora sono molto semplici (poche righe di codice!). Quando i programmi diventano piu' complessi, scrivere tutto il codice in un singolo file .c puo' essere problematico (si genererebbero file composti anche da decine di migliaia di righe di codice!!! Illeggibili ed immantenibili...)
Per questo, il linguaggio C permette di separare le funzioni che compongono un programma in diversi file .c... Un file contiene la funzione main(), altri contengono le altre funzioni invocate da main().
Questa divisione delle funzioni in moduli e' spesso fatta raggruppando fra loro (nello stesso file) funzioni fra loro consistenti dal punto di vista logico - ma a noi questi aspetti di modularizzazione del codice per ora non interessano...
Problema: se una funzione che sta in un file .c deve invocare una funzione che sta in un file .c diverso, come fa a conoscerne il prototipo (dichiarazione)?
Risposta: funzioni definite in un file .c (compilation unit) che possono essere invocate da file .c differenti devono avere i prototipi in un header file (file .h) che viene incluso da chi vuole invocare tali funzioni!!!
Programma per il calcolo del massimo comun divisore diviso in due file:
L'esempio su inserimento ordinato in lista, usando puntatori puo' essere riscritto separando in un file .c a parte (con relativo header file .h) tutte le operazioni che agiscono sulle liste.
Il file .c contenente la funzione main non conterra' piu' quindi alcun codice specifico che agisce sulle liste.
Le operazioni per agire sulle liste, isolate in un file operazioni_lista.c (con relativo header operazioni_lista.h) sono:
Il file operazioni_lista.h contiene inoltre la dichiarazione (non la definizione!!!) di "struct elemento".
Il file lista_ordinata-modulare.c contiene la funzione main().