Napisałeś funkcje, które działają. Generator rand i algorytm bubble_sort są niezawodne. Teraz musisz użyć ich w innych miejscach. Kopiowanie i wklejanie kodu to bałagan. To powoduje błędy. To sprawia, że ​​wsparcie staje się koszmarem.

Rozwiązaniem jest biblioteka narzędzi.

W C biblioteka nie jest magicznym pudełkiem. Są to dwa konkretne pliki współpracujące ze sobą: plik nagłówkowy (.h ) i plik źródłowy (.c ). Plik nagłówkowy informuje kompilator, co jest dostępne. Plik źródłowy zawiera samą logikę.

Oto jak zbudować podstawową bibliotekę C, aby zachować czystość i modułowość kodu.

Definicja interfejsu

Każda funkcja publiczna musi mieć deklarację. Jest w pliku nagłówkowym.

Utwórz plik o nazwie util.h.

Linie te są prototypami funkcji. Słowo kluczowe „extern” jest ważne. Mówi kompilatorowi: “Ta funkcja istnieje, ale jeszcze nie wiem gdzie. Znajdę ją później na etapie łączenia.”

Jeśli używasz bardzo starego kompilatora C, być może będziesz musiał usunąć nazwy parametrów z bubble_sort. Nowoczesne standardy faworyzują pełne prototypy, ale starszy kod często je usuwa.

Implementacja logiki

Teraz najtrudniejsza część. Utwórz util.c.

Zwróć uwagę na połączenie. Używasz cudzysłowów („util.h”), a nie nawiasów ostrych ( ). Nawiasy ostre są zarezerwowane dla bibliotek systemowych znajdujących się w standardowych katalogach. Cudzysłowy mówią kompilatorowi, aby szukał pliku w bieżącym katalogu.

Jest tu subtelna funkcja bezpieczeństwa. Zmienna rand_seed jest zdefiniowana w pliku .c, ale nie w pliku .h. To ukrywanie informacji.

Programy zawierające util.h wiedzą o rand(). Nie wiedzą o rand_seed. Nie mogą przypadkowo zmienić nasion. Jeśli chcesz to ściśle egzekwować, możesz dodać słowo kluczowe static przed int rand_seed. Spowoduje to, że zmienna będzie widoczna tylko w tym pojedynczym pliku.

Korzystanie z biblioteki

Twój główny program nie musi być wdrażany. Potrzebuje tylko interfejsu.

Utwórz main.c.

Zaleta jest oczywista. Podstawowa logika staje się krótsza. Nie zaśmiecasz głównego kodu algorytmami sortowania ani generatorami liczb losowych. Po prostu ich przywołujesz.

Kompilacja i linkowanie

W tym miejscu potyka się większość nowicjuszy. Nie możesz skompilować wszystkiego na raz, jeśli chcesz uzyskać osobne pliki obiektowe. Musisz je skompilować osobno, a następnie połączyć.

Zakładając, że używasz systemu typu UNIX, oto przepływ pracy.

Najpierw skompiluj kod źródłowy biblioteki do pliku obiektowego.

,,bicie
gcc -c -g util.c

Spowoduje to utworzenie pliku main.o. Powtórzę jeszcze raz: to tylko kod maszynowy. To nie jest jeszcze plik wykonywalny.

Na koniec zwiąż je razem.

,,bicie
gcc -o main main.o util.o

Zobaczysz listę dziesięciu liczb losowych, po której następuje separator myślnik, a następnie posortowana lista.

Dlaczego to jest ważne?

Możesz zapytać: po co zawracać sobie głowę tym dodatkowym krokiem? Dlaczego po prostu nie umieścić funkcji w pliku main.c?

Ponieważ biblioteki skalują się. W miarę rozwoju projektów będziesz mieć do dyspozycji dziesiątki funkcji użytkowych. Przechowywanie ich w oddzielnych plikach pozwala na ich ponowne wykorzystanie w różnych projektach.