Organização de arquivos C

Estou acostumado a fazer toda a minha codificação em um arquivo C. No entanto, estou trabalhando em um projeto grande o suficiente para que seja impraticável fazê-lo. Estive #incluindo-os juntos, mas encontrei alguns casos em que estou #incluindo alguns arquivos várias vezes etc. Ouvi falar de arquivos .h, mas não sei ao certo qual é a função deles (ou por que ter 2 arquivos é melhor que 1).

Quais estratégias devo usar para organizar meu código? É possível separar funções "públicas" das funções "privadas" para um arquivo específico?

este A pergunta precipitou minha pergunta. O arquivo tea.h não faz referência ao arquivo tea.c. O compilador "sabe" que todo arquivo .h tem um arquivo .c correspondente?

questionAnswers(8)

yourAnswerToTheQuestion