Jak strukturovat funkce C pro vytvoření opakovaně použitelné knihovny nástrojů

13

Napsal jsi kód. Funguje to. Nyní však chcete použít generátor rand() nebo proceduru bubble_sort v úplně jiném projektu. Kopírování a vkládání je líné. To je také křehký přístup. Když aktualizujete jednu verzi, musíte hledat každou kopii kódu.

Profesionální řešení? Vytvořte knihovnu.

V ekosystému C není knihovna magickou černou skříňkou. Jedná se pouze o dva soubory, které plní různé role. Potřebujete hlavičkový soubor (.h ) a zdrojový soubor (.c ). Soubor záhlaví informuje zbytek světa, jaké funkce existují. Zdrojový soubor dělá skutečnou práci.

Vytvoření rozhraní: util.h

Soubor záhlaví funguje jako smlouva. Neobsahuje žádnou logiku. Obsahuje sliby. Konstanty, typy a funkční prototypy.

Vytvořte soubor s názvem util.h.

Klíčová slova „exter“ udělají těžkou práci. Řeknou kompilátoru: “Nehledejte zde implementaci. Najdu ji později během linkování.” Pokud jste uvízli na zastaralém kompilátoru, který předchází moderním standardům C, odeberte možnosti z bubble_sort. Staré kompilátory jsou tak vybíravé.

Skrývací mechanismy: util.c

Nyní samotný kód. Uložte to jako util.c.

Věnujte pozornost směrnici include. Používáme uvozovky ("util.h" ) spíše než lomené závorky ( ). Na rozdílu záleží. Nabídky se hledají v aktuálním adresáři. Lomené závorky se hledají v systémových adresářích. Tento soubor je místní. Patří sem.

Zde je jemný bod: rand_seed. Nachází se v util.c. není v util.h. Jedná se o informace skrývající se v akci. Kód využívající tuto knihovnu může volat rand(), ale nemůže přímo přistupovat k semínku. Stát je zapouzdřený. Pro přísnou kontrolu můžete před definici proměnné přidat klíčové slovo static. To spolehlivě blokuje přístup. Žádný externí přístup. Tečka.

Využití knihovny: main.c

Nyní napište program, který to použije. Uložte to jako main.c.

Zkrátka? Ano. Čistič? Nepochybně. Hlavní program se nestará o to, jak rand() generuje čísla. Jen se ptá na číslo. Toto rozdělení je podstatou.

Kompilace a propojení

Jak mohu tyto jednotlivé soubory změnit na funkční spustitelný soubor? Dodržujete tříkrokový tanec.

Nejprve zkompilujte zdrojový kód knihovny do objektového souboru. Za předpokladu, že používáte systém podobný UNIXu s GCC:

Zde je vyžadován příznak -c. Říká kompilátoru, aby se zastavil po vytvoření souboru objektu. Vytváří util.o. Tento soubor obsahuje strojový kód, ale je neúplný. Nemá funkci „hlavní“. Nemůže pracovat sám. Toto je součást, ne produkt.

Dále zkompilujte svůj hlavní program:

Tím se vygeneruje main.o. Opět jen strojový kód. Stále žádná knihovní logika.

Nakonec je spojte dohromady.

Tento příkaz vezme oba objektové soubory a sloučí je do jednoho spustitelného souboru s názvem main. Nyní máte kompletní program. Spusťte jej pomocí ./main (nebo pouze main, pokud používáte Windows nebo je přidán do vaší PATH).

To je hodně kroků pro dvě funkce. Ale představte si, že byste to dělali pro projekt s padesáti soubory. Každý soubor .c zkompilujete jednou. Svážete je dohromady. Změnili jste funkci v knihovně? Překompilujte pouze tento soubor. Znovu uvázat. Zbytek zůstává nedotčen.

Makefiles to automatizují