En C, no puede hacer referencias hacia adelante, es decir. use una función aún no definida antes de su uso. Los encabezados están hechos originalmente para eso, como referencias a la implementación.
Miré la respuesta aceptada de la pregunta a la que se hace referencia, y es correcta. Pero hoy en día, la velocidad de compilación es un problema menor (excepto, tal vez, con aplicaciones muy grandes: se necesita 1/4hr para compilar limpio la aplicación que tenemos, al menos en Windows). Y los detalles de la implementación están ocultos de todos modos, generalmente solo observamos la documentación de la API, es decir. la interfaz visible.
Para la anécdota, vi algunas librerías C++ implementadas al 99% en encabezados (solo con archivos .cpp donde el sistema los solicitaba), imitando así el estilo Java (C# no estaba aquí en ese momento ...).
Pero también permite algunas sutilezas, como decidir qué debe estar en la interfaz pública (las funciones en el archivo de encabezado) y cosas ocultas (por ejemplo, funciones estáticas en el archivo .c). – csl
@csl: hay muchas formas mejores de lograr eso. Delphi tiene secciones de "implementación" e "interfaz" separadas dentro de un solo archivo, por ejemplo. – Roddy
Si bien me gusta el encabezado/fuente de separación en C/C++, y no me gusta la visión de "una fuente" en Java, estoy de acuerdo con todo lo que dijo. +1 – paercebal