Ostatnim czasem sporo kombinuje z assemblerem, funkcjami typu inline i różnymi dziwnymi rzeczami

Z tego też względu chciałbym dokładniej poznać kwestię dotyczące podziału kodu na pliki .h .c
Generalnie jak dotąd nie było mi to specjalnie potrzebne i po prostu w pliki.c wrzucałem ciała funkcji - definicję,
natomiast w pliki.h nazwy funkcji z przypisanymi argumentami - deklarację.
Pliki.c nigdy nie są linkowane do projektu, tylko pliki.h - dlaczego?
Dowiedziałem się również, że czasem w pliki.h wrzuca się pełne funkcję... (co obecnie stosuje, ze względu na nietypowy sposób zarządzania funkcjami)
Oczywiście, znam pełną koncepcję z pkt widzenia organizacji projektu, jego czytelności itp, ale czy poza względami organizacyjnymi występują tam jakieś niuanse techniczne?