Aby poprawnie skompilować kod, kompilator musi mieć informacje o typie zmiennych/funkcji. W plikach nagłówkowych zamieszczasz deklaracje (czyli “wyjaśnienia” dla kompilatora co jest czym). Natomiast w plikach źródłowych z kodem (.c) zamieszcza definicje (“mówiące” kompilatorowi nie tylko co jest czym, ale również jak działa / jakie ma wartości itp.).
U Ciebie powinno to wyglądać:
plik1.h z deklaracjami. Dla funkcji są to po prostu jej nagłówki bez ciała. Warto dodać też coś zwanego strażnikiem nagłówka, aby nie spowodować nieskończonego rekurencyjnego dołączania nagłówków.
#ifndef _NAZWA_PLIKU_H_
#define _NAZWA_PLIKU_H_
#define PI 3.1415 // opcjonalnie, może wystarczy tylko w plik1.c ?
float prostopadloscian(float dlugosc, float szerokosc, float wysokosc);
float walec(float promien_podstawy_walca, float wysokosc_walca);
float stozek(float promien_podstawy_stozka, float tworzaca_stozka);
#endif
Do plik1.c i plik2.c dołączasz plik1.h (ogólnie dołączasz go wszędzie, gdzie chcesz używać wymienionych w nim funkcji).