Según tengo entendido (limitado: normalmente no soy un desarrollador de C), esto se basa en C. Recuerde que C no sabe qué clases o espacios de nombres son, es solo un programa largo. Además, las funciones deben declararse antes de usarlas.
Por ejemplo, lo siguiente debería dar un error de compilación:
void SomeFunction() {
SomeOtherFunction();
}
void SomeOtherFunction() {
printf("What?");
}
El error debería ser que "SomeOtherFunction no está declarado" porque lo llamas antes de su declaración. Una forma de solucionar esto es moviendo SomeOtherFunction sobre SomeFunction. Otro enfoque es declarar primero la firma de funciones:
void SomeOtherFunction();
void SomeFunction() {
SomeOtherFunction();
}
void SomeOtherFunction() {
printf("What?");
}
Esto le permite al compilador saber: Busque en alguna parte del código, hay una función llamada SomeOtherFunction que devuelve void y no toma ningún parámetro. Entonces, si encuentra un código que intenta llamar a SomeOtherFunction, no entre en pánico y, en su lugar, vaya a buscarlo.
Ahora, imagine que tiene SomeFunction y SomeOtherFunction en dos archivos .c diferentes. Luego debe #incluir "SomeOther.c" en Some.c. Ahora, agregue algunas funciones "privadas" a SomeOther.c. Como C no conoce funciones privadas, esa función también estaría disponible en Some.c.
Aquí es donde entran los archivos .h: especifican todas las funciones (y variables) que desea 'Exportar' desde un archivo .c al que se puede acceder en otros archivos .c. De esa manera, obtienes algo así como un alcance público / privado. Además, puede entregar este archivo .h a otras personas sin tener que compartir su código fuente: los archivos .h también funcionan con archivos compilados .lib.
Entonces, la razón principal es realmente la conveniencia, la protección del código fuente y tener un poco de desacoplamiento entre las partes de su aplicación.
Eso fue C sin embargo. C ++ introdujo clases y modificadores privados / públicos, por lo que si bien aún se puede preguntar si son necesarios, C ++ AFAIK aún requiere la declaración de funciones antes de usarlos. Además, muchos desarrolladores de C ++ también son o fueron devleopers de C ++ y asumieron sus conceptos y hábitos a C ++. ¿Por qué cambiar lo que no está roto?