C Standardní knihovna

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 17. června 2021; kontroly vyžadují 6 úprav .

Standardní knihovna C (také známá jako libc , crt ) je součástí standardu ANSI C věnovaná hlavičkovým souborům a knihovním rutinám . Je popis implementace běžných operací jako I/O a zpracování řetězců v programovacím jazyce C. Standardní knihovna C je popis programovacího rozhraní , nikoli skutečná knihovna použitelná v procesu kompilace .

Struktura

Název a charakteristiky každé funkce jsou specifikovány v souboru zvaném hlavičkový soubor , ale aktuální implementace funkcí je popsána samostatně v souboru knihovny . Názvy a možnosti hlavičkových souborů jsou běžné, ale organizace knihoven je stále heterogenní. Standardní knihovna je obvykle dodávána s kompilátorem . Protože kompilátory jazyka C často poskytují rozšířenou funkčnost, která není definována standardem ANSI C , standardní knihovna jednoho kompilátoru je nekompatibilní se standardními knihovnami jiných kompilátorů.

Názory na strukturu

Velká část standardní knihovny C se zdá být dobře navržena. Některé jednotlivé části, které byly v minulosti výhodné, mohou být náchylné k chybám. Funkce pro zadávání řetězců gets()(a použití scanf()ke čtení vstupních řetězců) jsou zdrojem mnoha přetečení vyrovnávací paměti , takže většina programovacích příruček vám doporučuje se těmto trikům vyhnout. Funkce strcpy()je také dost neslavná. Další nejednoznačnou funkcí je strtok() - funkce navržená jako jednoduchý lexikální analyzátor , ale má mnoho „úskalí“, a proto je velmi obtížně použitelná.

Volba použít typ size_tmísto intpro počet prvků zadaných pro fread()a fwrite()je nekonzistentní s obecnou sémantikou vyvinutou pro size_t(k reprezentaci počtu bajtů).

stdioje dosti omezený (příliš vysoká úroveň pro použití v mnoha situacích) a standard neumožňuje uživateli, aby si jeho vlastnosti sám přeřadil nebo rozšířil. Výsledkem je, že mnoho aplikací vyvíjí své vlastní knihovny obalů kolem mechanismů a funkcí nižší úrovně implementovaných operačním systémem, jako je POSIX . Například stdionepracují se signály nebo asynchronními non-burst I/O režimy, které jsou široce používány na síťových serverech. Výsledkem je, že se na funkce stdiomohou plně spolehnout pouze servery, které používají model celého procesu, aby je klient obsluhoval na systémech kompatibilních s POSIX v dávkovém I/O.

Při vývoji vícevláknových aplikací byste se měli vyvarovat určitých funkcí standardní knihovny . Primitiva řízení vláken byla zamýšlena pro zbytek operačního systému a ignorují běžné standardy, jako je knihovna vláken POSIX, přičemž se očekávalo, že programátoři v jazyce C se o to postarají sami a budou pracovat s opětovným použitím a synchronizací. Jazyk C ani jeho standardní knihovna žádným způsobem nekontrolují takové výsledky specifické pro systém.

Historie

Programovací jazyk C před standardizací neposkytoval vestavěné funkce, jako jsou I/O operace (na rozdíl od tradičních jazyků, jako jsou Cobol a Fortran ). Později se v komunitě programátorů v jazyce C zrodily nápady, které byly implementovány do toho, co dnes nazýváme standardní knihovnou jazyka C , na podporu této funkce. Většina z těchto myšlenek se nakonec sešla a definovala standard programovacího jazyka C.

Unix i C byly vytvořeny v Bell Laboratories AT&T koncem 60. a začátkem 70. let. V 70. letech se začal programovací jazyk C stát neuvěřitelně populární. Mnoho univerzit a organizací začalo vytvářet vlastní verze jazyka, vhodnější pro jejich vlastní potřeby. Od počátku 80. let se problémy s kompatibilitou mezi různými implementacemi jazyka C staly až příliš zjevnými. V roce 1983 , American National Standards Institute (ANSI) vytvořil výbor pro přijetí standardu pro jazyk C, známý jako „ANSI C“. Tato práce vyústila v roce 1989 ve vytvoření tzv. standardu C89 . Součástí výsledného standardu byla sada knihoven nazvaná ANSI C Standard Library .

Následující verze standardu jazyka C přidaly do knihovny některé nové a užitečnější soubory záhlaví. Podpora těchto nových rozšíření závisela na implementaci.

Soubory záhlaví <iso646.h> , <wchar.h> a <wctype.h> byly přidány do přílohy 1 (zkráceně NA1 ), dodatku ke standardu C ratifikovanému v roce 1995 .

Soubory záhlaví <complex.h> , <fenv.h> , <inttypes.h> , <stdbool.h > , <stdint.h> a <tgmath.h> byly přidány do C99 , verze standardu C publikováno v roce 1999 .

Standard ANSI

Standardní knihovna ANSI C se skládá z 24 hlavičkových souborů, z nichž každý může být zahrnut do softwarového projektu pomocí jediné směrnice. Každý soubor záhlaví obsahuje jednu nebo více deklarací funkcí, definic datových typů a maker. Obsah těchto hlavičkových souborů je uveden níže.

Ve srovnání s některými jinými jazyky (jako je Java ) je standardní knihovna extrémně malá. Knihovna poskytuje podporu pro základní sadu matematických funkcí, zpracování řetězců, konverzi typů, souborové a konzolové I/O. Neobsahuje standardní sadu "typů kontejnerů", jako je knihovna standardních šablon C++ , komponenty pro práci s grafickým uživatelským rozhraním (GUI), síťování a další různé funkce, které Java standardně podporuje. Hlavní výhodou malé standardní knihovny je to, že usnadňuje práci s prostředím ANSI C než jiné jazyky, a tedy usnadňuje portování programů C na nové platformy.

Mnoho dalších knihoven bylo vyvinuto tak, aby podporovaly podobnou funkčnost poskytovanou jinými jazyky v jejich standardních knihovnách. Projekt GNOME Desktop Environment Development Project například vyvinul sadu grafických nástrojů GTK+ a GLib  , knihovnu kontejnerových datových struktur a mnoho dalších známých příkladů. Rozmanitost dostupných knihoven znamená, že některé nástroje nejvyšší úrovně se časem ukázaly jako užitečné. Významnou nevýhodou je, že mezi sebou často špatně interagují, takže programátoři jsou často více zvyklí pracovat s různými sadami knihoven a jejich sady mohou být dostupné na různých specifických platformách.

Soubory záhlaví knihovny ANSI C s doplňky C99 a C11

< tvrdit.h > Obsahuje makro výrazu , které se používá k detekci logických a některých dalších typů chyb v laděné verzi programu.
< complex.h > Sada funkcí pro práci s komplexními čísly . (Představeno v C99 )
< ctype.h > Obsahuje funkce používané ke klasifikaci znaků podle jejich typů nebo ke konverzi mezi velkými a malými písmeny bez ohledu na použité kódování (obvykle ASCII nebo některá z jeho rozšíření, i když existují implementace, které používají EBCDIC ).
< errno.h > Chcete-li zkontrolovat chybové kódy vrácené funkcemi knihovny.
< fenv.h > Chcete-li ovládat prostředí, které používá čísla s pohyblivou řádovou čárkou . (Představeno v C99 )
< float.h > Obsahuje předdefinované konstanty, které popisují implementační specifika vlastností knihovny pro práci s čísly s pohyblivou řádovou čárkou , jako je minimální rozdíl mezi dvěma různými čísly s pohyblivou řádovou čárkou (_EPSILON), maximální počet číslic přesnosti (_DIG) a rozsah platných čísel ( _MIN, _MAX).
< inttypes.h > Pro přesný převod celočíselných typů. (Představeno v C99 )
< iso646.h > Pro programování v kódování ISO 646 . (Objevilo se v NA1 )
< limity.h > Obsahuje předdefinované konstanty, které definují implementační specifika vlastností celočíselných typů, jako je rozsah platných hodnot (_MIN, _MAX).
< locale.h > Pro setlocale() a související konstanty. Slouží k výběru vhodného jazyka .
< math.h > K výpočtu základních matematických funkcí
< setjmp.h > Deklaruje makra setjmpa longjmppoužívá se pro nelokální skoky
< signál.h > Pro ovládání zpracování signálu
< stdarg.h > Pro přístup k jinému počtu argumentů předávaných funkcím.
< stdbool.h > Pro booleovské datové typy. (Představeno v C99 )
< stdint.h > Chcete-li definovat různé typy celých čísel. (Představeno v C99 )
< stddef.h > Definovat několik standardních typů a maker.
< stdio.h > Implementuje základní vstupní a výstupní schopnosti v jazyce C. Tento soubor obsahuje velmi důležitou funkci printf.
< stdlib.h > K provádění různých operací, včetně konverze, generování pseudonáhodných čísel , alokace paměti, řízení procesů, řízení prostředí, signálů, vyhledávání a třídění.
< řetězec.h > Pro práci s různými druhy strun.
< tgmath.h > Pro typické matematické funkce. (Představeno v C99 )
< threads.h > Hlavičkový soubor <threads.h> spolu s <stdatomic.h> poskytuje podporu pro paralelní programování. (Zavedeno v C11 )
< čas.h > Pro převod mezi různými formáty času a data.
< wchar.h > Pro zpracování "širokých" proudů a více druhů řetězců pomocí "širokých" znaků (podpora jazykové sady). (Objevilo se v NA1 )
< wctype.h > Pro klasifikaci "širokých" znaků. (Objevilo se v NA1 )

Standardní knihovna C v jiných jazycích

Některé jazyky poskytují funkce standardní knihovny C s vlastními knihovnami. Knihovnu lze přizpůsobit strukturám jazyka, ale sémantika operací zůstává podobná. Programovací jazyk C++ například obsahuje funkce standardní knihovny ANSI C ve jmenném prostoru std ( např. , atd. ), v hlavičkových souborech s podobnými názvy C (" "", " " ", " " atd.) ...). Mezi další jazyky, které mají podobný přístup, patří například D a Python . Ve druhém případě je například vestavěný objektový soubor definován jako „implementovaný balíčkem C stdio“ [1] , takže se očekává, že dostupné operace (otevření, čtení, zápis atd.) se budou chovat jako odpovídající C jazykové funkce. std::printfstd::atoistd::feofcstdiocmathcstdlib

Obecná podpora knihoven

Dosud nejsou standardizovány, ale programy C mohou záviset na knihovnách podprogramů, které obsahují kód používaný kompilátorem za běhu. Kód, který inicializuje proces pro operační systém, například před voláním main(), je implementován v CRT Run-Time Library (CRT) pro tuto verzi kompilátoru. Kód knihovny CRT může pomoci implementovat další jazykové funkce, jako je zpracování nezachycených výjimek nebo implementace čísel s pohyblivou řádovou čárkou.

Standardní knihovna C pouze reguluje přítomnost výše uvedených podprogramů a jejich chování. Protože implementace kompilátoru může záviset na přítomnosti těchto dodatečných funkcí, vše závisí na tom, které rutiny jsou zkompilovány do standardní knihovny C, takže je bude potřebovat jakýkoli program vyvinutý s nimi.

Ačkoli jsou často zaměňovány se standardní knihovnou C kvůli jejich svázání, knihovna CRT není standardizovanou součástí jazyka a závisí na způsobu dodání softwaru.

Vnitřní vlastnosti kompilátoru

Některé kompilátory (např . GCC [1] ) podporují interní verze mnoha funkcí v C Standard Library; to znamená, že implementace funkcí jsou zapsány do kompilovaného objektového modulu a program volá interní verze namísto funkcí sdílené knihovny C. To snižuje režii volání funkce, zejména pokud je volání funkce nahrazeno vestavěnými variantami a jsou povoleny jiné formy optimalizace (pokud kompilátor podporuje řízení charakteristik interních variant), ale může to vést k problémům s laděním (např. nelze nahradit verzemi nástrojů ).pro kontrolu).

Standardní knihovna POSIX

POSIX (a SUS ) definují řadu podprogramů, které mohou být dostupné nad rámec těch, které jsou definovány ve standardní knihovně C; často implementují funkcionalitu podobnou standardní knihovně, s různou mírou podobnosti. Například glibc implementuje funkce jako fork v libc.so, ale streamingové knihovny jsou před voláním sloučeny do glibc, i když je inzerována jako samostatná knihovna s vlastním příznakem linkeru. Často je taková funkčnost kompatibilní s POSIX považována za součást knihovny; odpovídající knihovnu C lze tedy identifikovat jako knihovnu ANSI nebo ISO C.

Implementace

Existuje mnoho implementací, které přicházejí s různými operačními systémy a kompilátory C. Na systémech BSD je například systémová knihovna zabudována do operačního systému a udržována sdíleným zdrojovým úložištěm. Na většině systémů lze knihovnu nalézt pod názvem „ libc“.

Přestože existuje mnoho implementací, zde je malý seznam nejoblíbenějších knihoven:

Viz také

Odkazy

  1. Další vestavěné funkce poskytované GCC Archivováno 11. prosince 2008 na Wayback Machine , GCC Guide
  2. Re: Podporuje Newlib procesory bez mmu? (nedostupný odkaz) . Získáno 3. října 2008. Archivováno z originálu dne 22. listopadu 2008. 
  3. musl - Úvod . www.musl-libc.org. Získáno 30. ledna 2017. Archivováno z originálu 12. listopadu 2020.

Další zdroje