À ma compréhension (limitée - je ne suis pas un développeur C normalement), ceci est enraciné dans C. Rappelez-vous que C ne sait pas ce que sont les classes ou les espaces de noms, c'est juste un long programme. De plus, les fonctions doivent être déclarées avant de les utiliser.
Par exemple, ce qui suit doit donner une erreur du compilateur:
void SomeFunction() {
SomeOtherFunction();
}
void SomeOtherFunction() {
printf("What?");
}
L'erreur devrait être que "SomeOtherFunction n'est pas déclaré" parce que vous l'appelez avant sa déclaration. Une façon de résoudre ce problème consiste à déplacer SomeOtherFunction au-dessus de SomeFunction. Une autre approche consiste à déclarer d'abord la signature des fonctions:
void SomeOtherFunction();
void SomeFunction() {
SomeOtherFunction();
}
void SomeOtherFunction() {
printf("What?");
}
Cela permet au compilateur de savoir: Regardez quelque part dans le code, il y a une fonction appelée SomeOtherFunction qui renvoie void et ne prend aucun paramètre. Donc, si vous rencontrez du code qui tente d'appeler SomeOtherFunction, ne paniquez pas et allez plutôt le chercher.
Maintenant, imaginez que vous avez SomeFunction et SomeOtherFunction dans deux fichiers .c différents. Vous devez ensuite #inclure "SomeOther.c" dans Some.c. Maintenant, ajoutez quelques fonctions "privées" à SomeOther.c. Comme C ne connaît pas les fonctions privées, cette fonction serait également disponible dans Some.c.
C'est là que les fichiers .h entrent en jeu: ils spécifient toutes les fonctions (et variables) que vous souhaitez «exporter» à partir d'un fichier .c accessible dans d'autres fichiers .c. De cette façon, vous gagnez quelque chose comme une portée publique / privée. De plus, vous pouvez donner ce fichier .h à d'autres personnes sans avoir à partager votre code source - les fichiers .h fonctionnent également avec les fichiers .lib compilés.
Donc, la raison principale est vraiment pour la commodité, pour la protection du code source et pour avoir un peu de découplage entre les parties de votre application.
C'était C cependant. C ++ a introduit les classes et les modificateurs privés / publics, donc même si vous pouvez toujours demander s'ils sont nécessaires, C ++ AFAIK nécessite toujours la déclaration des fonctions avant de les utiliser. De plus, de nombreux développeurs C ++ sont ou étaient également des développeurs C et ont repris leurs concepts et leurs habitudes en C ++ - pourquoi changer ce qui n'est pas cassé?