Para o meu entendimento (limitado - normalmente não sou desenvolvedor de C), isso está enraizado no C. Lembre-se de que o C não sabe o que são classes ou namespaces, é apenas um programa longo. Além disso, as funções precisam ser declaradas antes de você usá-las.
Por exemplo, o seguinte deve dar um erro do compilador:
void SomeFunction() {
SomeOtherFunction();
}
void SomeOtherFunction() {
printf("What?");
}
O erro deve ser que "SomeOtherFunction não é declarado" porque você o chama antes da declaração. Uma maneira de corrigir isso é movendo SomeOtherFunction acima de SomeFunction. Outra abordagem é declarar a assinatura das funções primeiro:
void SomeOtherFunction();
void SomeFunction() {
SomeOtherFunction();
}
void SomeOtherFunction() {
printf("What?");
}
Isso permite que o compilador saiba: Procure em algum lugar no código, existe uma função chamada SomeOtherFunction que retorna nula e não aceita parâmetros. Portanto, se você encontrar um código que tente chamar SomeOtherFunction, não entre em pânico e procure por ele.
Agora, imagine que você tenha SomeFunction e SomeOtherFunction em dois arquivos .c diferentes. Você precisa # incluir "SomeOther.c" em Some.c. Agora, adicione algumas funções "particulares" ao SomeOther.c. Como C não conhece funções privadas, essa função também estaria disponível em Some.c.
É aqui que entram os arquivos .h: Eles especificam todas as funções (e variáveis) que você deseja 'Exportar' de um arquivo .c que pode ser acessado em outros arquivos .c. Dessa forma, você ganha algo como um escopo Público / Privado. Além disso, você pode fornecer esse arquivo .h para outras pessoas sem precisar compartilhar seu código-fonte - os arquivos .h também funcionam com arquivos .lib compilados.
Portanto, o principal motivo é realmente a conveniência, a proteção do código-fonte e a dissociação entre as partes do aplicativo.
Isso foi C embora. O C ++ introduziu Classes e modificadores privado / público; portanto, enquanto você ainda pode perguntar se eles são necessários, o C ++ AFAIK ainda requer declaração de funções antes de usá-los. Além disso, muitos desenvolvedores de C ++ também são ou eram devleopers de C e assumiram seus conceitos e hábitos para C ++ - por que mudar o que não está quebrado?