Plik nagłówkowy, a bibliteka

0

Witam
Przeczytałem już wiele o bibliotekach w postach czy źródłach naukowych lecz nadal nie moge pojąć pewnej rzeczy.
Wszystko w oparciu o C.
Według wiki żeby zbudować bibliotekę trzeba :
pliku nagłówkowego z deklaracjami funkcji (plik z rozszerzeniem .h)
pliku źródłowego, zawierającego ciała funkcji (plik z rozszerzeniem .c)

Rozbicie bibliotek na dwa pliki jest po to żeby ? dlaczego od razu nie można było by wszystkiego umieścić w np. Pliku nagłówkowym ?
Przypuścimy że mam głowny program który bedzie korzystał z biblioteki X. Trzeba w głównym programie odwołać się do plików nagłówkowego biblioteki X który to znowu plik nagłówkowy odwoła sie do pliku źródłowego biblioteki X.
Dobrze zrozumiem ? Po co tak mieszać ;D
Doczytałem że plik nagłówkowy jest po to zeby nie można było umieszczać w główny kodzie programu kilka razy kodu pliku źródłowego w naszym przypadku biblioteki X.
Co stoi na przeszkodzie zeby połączyć w jeden plik Plik nagłówkowy .h i Plik źródłowy .c ?

Z góry dziękuje za pomoc.

0

Definicje funkcji/zmiennych nie moga powinny znajdowac sie w pliku naglowkowym, ze wzgledu na @down.

0
n0name_l napisał(a):

Definicje funkcji/zmiennych nie moga znajdowac sie w pliku naglowkowym.

Mogą, z punktu widzenia kompilatora to wszystko jedno. Jedyne czego nie może być to wielokrotne definicje - a taki właśnie problem może się wtedy pojawić.

Generalnie chodzi o to, że w bibliotece zaszyte są jakieś rzeczy (funkcje, klasy itd) i np. w przypadku funkcji musisz znać nie tylko nazwę ale typy argumentów i typ zwracany. Kompilator używa tego do sprawdzenia poprawności wywołania i wstawienia odpowiedniej nazwy (symbolu) w skompilowanym kodzie. Do czasu linkowania symbol ten nie jest połączony z niczym - to dopiero linker łączy to tak, żeby wywołanie funkcji się powiodło.

Nie musisz mieć żadnego pliku nagłówkowego. Ale wtedy za każdym razem musiałbyś deklarować wszystkie te funkcje - szkoda na to czasu. Z klasami jest jeszcze gorzej!

0

Teraz juz bardziej rozumiem :D ale jeszcze mnie jedna kwestia martwi :D
Biblioteki standardowe są umieszczone w katalogu include i tam są tylko pliki nagłówkowe *.h i jakieś katalogi, a nie ma nigdzie pliku źródłowego, zawierającego ciała funkcji *.c
Definicja z Wiki jasno mówi że
Każda biblioteka składa się z co najmniej dwóch części (oczywiście w praktyce nie istnieje górny limit):
pliku nagłówkowego z deklaracjami funkcji (plik z rozszerzeniem .h)
pliku źródłowego, zawierającego ciała funkcji (plik z rozszerzeniem .c)
Wiec dlaczego Biblioteki standardowe składają sie tylko z plików nagłówkowych ? Czy to może to jest nieścisłość w nazewnictwie ? Te pliki powinny się nazywać standardowymi plikami źródłowymi, a nie standardowymi bibliotekami.
Czy moze to jest jedna wielka biblioteka standradowa składająca sie z tych wszystkich plików nagłówkowych, a pliki źródłowe tej biblioteki umieszone są w podkatalogach katalogu include ?

0

Ale po co Ci te ciała funkcji? One są zupełnie zbędne. Plik nagłówkowy zawiera deklaracje tego, co w bibliotece. A sama biblioteka to (u mnie) plik /lib64/libc-2.16.so - to skompilowany kod tych wszystkich funkcji. Podczas kompilacji Twojego programu wstawiane są odpowiednie odwołania do tych funkcji, linker je łączy z tym kodem z biblioteki i podczas uruchamiania wykonywany jest ten skompilowany kod.

Jeżeli chcesz znaleźć te pliki .c to poszukaj źródeł Twojej biblioteki standardowej języka C. Żeby korzystać z biblioteki pliki te są zbędne. Tak na prawdę te nagłówkowe też - ale wtedy musiałbyś wszystko samemu deklarować.

1 użytkowników online, w tym zalogowanych: 0, gości: 1