Per la mia comprensione (limitata - normalmente non sono uno sviluppatore C), questo è radicato in C. Ricorda che C non sa cosa siano le classi o gli spazi dei nomi, è solo un lungo programma. Inoltre, le funzioni devono essere dichiarate prima di utilizzarle.
Ad esempio, quanto segue dovrebbe dare un errore del compilatore:
void SomeFunction() {
SomeOtherFunction();
}
void SomeOtherFunction() {
printf("What?");
}
L'errore dovrebbe essere che "SomeOtherFunction non è dichiarato" perché lo si chiama prima della sua dichiarazione. Un modo per risolvere questo problema è spostando SomeOtherFunction sopra SomeFunction. Un altro approccio è quello di dichiarare prima la firma delle funzioni:
void SomeOtherFunction();
void SomeFunction() {
SomeOtherFunction();
}
void SomeOtherFunction() {
printf("What?");
}
Questo fa sapere al compilatore: guarda da qualche parte nel codice, c'è una funzione chiamata SomeOtherFunction che restituisce void e non accetta alcun parametro. Quindi, se trovi codice che tenta di chiamare SomeOtherFunction, non farti prendere dal panico e vai a cercarlo.
Ora, immagina di avere SomeFunction e SomeOtherFunction in due diversi file .c. Devi quindi #includere "SomeOther.c" in Some.c. Ora, aggiungi alcune funzioni "private" a SomeOther.c. Poiché C non conosce funzioni private, tale funzione sarebbe disponibile anche in Some.c.
È qui che arrivano i file .h: specificano tutte le funzioni (e variabili) che si desidera "esportare" da un file .c a cui è possibile accedere in altri file .c. In questo modo, ottieni qualcosa come un ambito pubblico / privato. Inoltre, puoi dare questo file .h ad altre persone senza dover condividere il tuo codice sorgente - i file .h funzionano anche con i file .lib compilati.
Quindi il motivo principale è davvero per comodità, per la protezione del codice sorgente e per avere un po 'di disaccoppiamento tra le parti dell'applicazione.
Quello era C però. Il C ++ ha introdotto Classi e modificatori privati / pubblici, quindi sebbene si possa ancora chiedere se sono necessari, C ++ AFAIK richiede comunque la dichiarazione delle funzioni prima di utilizzarle. Inoltre, molti sviluppatori C ++ sono o erano anche devoti C e hanno assunto i loro concetti e abitudini in C ++ - perché cambiare ciò che non è rotto?