Standardní knihovna jazyka C je v informatice implementace standardní knihovny podle standardu ANSI C.[1] Je podmnožinou POSIX specifikace knihovny jazyka C, která byla vytvořena ve stejné době.[2][3] Od chvíle, kdy bylo ANSI C přijato jako ISO standard,[4] je také nazývána jako knihovna ISO C (anglicky ISO C library).
Standardní knihovna jazyka C poskytuje makra, definice datových typů a funkcí pro práci s textovými řetězci, matematické výpočty, práci se vstupy a výstupy, správu paměti a několik dalších služeb operačního systému. Zahrnuje hlavičkové soubory programovacího jazyka C.
Programovací jazyk C, na rozdíl od tehdy tradičních jazyků jako byl Cobol a Fortran, před svou standardizací neobsahoval vnořené funkce jako například vstupně/výstupní operace. Nedostatek postupem času napravovala uživatelská komunita, vytvářející myšlenku implementace chybějících funkcí a později i jejich stmelení do sady, která se nyní nazývá Standardní knihovna jazyka C. Mnoho z těchto myšlenek se zároveň stalo přímo součástí definice standardu programovacího jazyka C.
Unix a programovací jazyk C vznikaly v Bellových laboratořích firmy AT&T na konci šedesátých a počátku sedmdesátých let. Během sedmdesátých let nabral programovací jazyk C na popularitě a mnoho universit a vládních i nevládních organizací začalo používat ve svých projektech své vlastní variace jazyka, což na počátku osmdesátých let vyústilo ve zřejmé problémy vzájemné kompatibility rozdílných implementací. V roce 1983 sestavil institut ANSI komisi za účelem vytvoření specifikace standardu dnes známého jako ANSI C, která v roce 1989 vyvrcholila vznikem standardu C89. Součástí nově vzniklého standardu je i sada softwarových knihoven nazvaná ANSI C standard library (Standardní knihovna ANSI C).
Následující verze standardu jazyka C přinášely do vzniklé knihovny další požadované hlavičkové soubory, ale podpora těchto nových rozšíření se liší v závislosti na jednotlivých implementacích. Hlavičkové soubory <iso646.h>, <wchar.h> a <wctype.h> byly přidány s prvním rozšířením normy (označovaným NA1) v roce 1995. Následující aktualizace byla provedena v roce 1999 v souvislosti s vydáním standardu C99 a přibyly hlavičkové soubory s názvy: <complex.h>, <fenv.h>, <inttypes.h>, <stdbool.h>, <stdint.h> a <tgmath.h>.
Knihovna standardu ISO C obsahuje 24 hlavičkových souborů jazyka C, pomocí kterých je možné vytvořit program nezávislý na svém okolí. Každý hlavičkový soubor obsahuje jednu či více deklarací funkcí a definice typů a maker. Hlavičkové soubory standardu ISO C jsou uvedeny v tabulce níže.
V porovnání s jinými jazyky (například Java) je velikost standardní knihovny nepatrná. Knihovna poskytuje základní sadu matematických funkcí, funkce pro práci s řetězci a funkce pro souborový a konzolový vstup a výstup. Nezahrnuje ale standardní sadu pro práci s kontejnery, která je obsažena ve standardu knihovny C++, také se nezabývá specifikací grafického uživatelského rozhraní, síťových nástrojů a dalších, které jsou obsaženy například ve standardu programovacího jazyka JAVA. Hlavní výhodou plynoucí z kompaktnosti malé standardní knihovny je její jednoduchost a následná snadná přenositelnost na nové platformy.
V průběhu času bylo vydáno několik knihoven, které přidávají stejné funkce jako standardní knihovny jiných jazyků. Mezi nejznámější knihovny paří projekt GNOME, který vytvořil soubor grafických nástrojů GTK+ a GLib. Jejich nevýhoda samozřejmě spočívá v tom, že spolu jednotlivé nestandardní knihovny vzájemně nespolupracují a programátoři se většinou musí učit pracovat s novými sadami funkcí.
Některé funkce ve standardní knihovně jazyka C byly od svého uvedení nechvalně známé svými zranitelnostmi způsobenými přetečením bufferu a obecně podporou špatného stylu programování.[pozn. 1] Nejkritizovanějšími problémy jsou:
strcpy()
strcat()
printf()
gets()
scanf()
Kromě extrémního případu s funkcí gets() se lze všem bezpečnostním zranitelnostem vyhnout použitím pomocných fragmentů kódu, které provádějí správu paměti, kontrolují meze, provádějí kontroly vstupů, atd. Tyto kontroly mohou mít podobu obalujícího kódu, který činí funkce standardní knihovny bezpečnějšími a snáze použitelnými. Obalující funkce jsou použity již v knize The Practice of Programming Kernighana a Pikeho, v níž takové funkce vypisují chybové zprávy a ukončují program, pokud dojde k chybě.
Výbor ISO C publikoval technickou zprávu TR 24731-1[5] a pracuje na TR 24731-2,[6] které navrhují přijetí některých funkcí s kontrolou mezí a automatickým přidělováním paměti. První zpráva se setkala s ostrou kritikou a nečetnými pochvalami,[7][8] druhá se setkala se smíšenými reakcemi. Bez ohledu na to Microsoft implementoval TR 24731-1 do své standardní knihovny jazyka C a jeho překladač vypisuje varování při použití starých „nebezpečných“ funkcí.
Funkce strerror() je kritizována pro svoji vláknovou nebezpečnost a zranitelnost vlivem souběhu.
strerror()
Zpracovávání chyb není ve funkcích ze standardní knihovny jazyka C konzistentní a je někdy matoucí. Podle manuálové stránky Linuxu math_error je „aktuální (verze 2.8) situace v glibc je nepřehledná. Většina (ale ne všechny) funkce vyhazují při chybách výjimky. Některé také nastavují proměnnou errno. Několik funkcí nastavuje errno, ale nevyhazuje výjimku. A velmi málo funkcí nedělá ani jedno ani druhé.“[9]
math_error
errno
Některé programovací jazyky zahrnují funkce standardní knihovny jazyka C ve svých vlastních knihovnách. Knihovny v jiných programovacích jazycích jsou většinou přizpůsobené, aby více vyhovovaly struktuře daného programovacího jazyka, ale funkce a sémantika je zachována. Programovací jazyk C++ například zahrnuje funkce standardu knihovny ANSI C, co se týče jména funkcí std (jako std::printf, std::atoi, std::feof, etc.) a podobná jména hlavičkových souborů (cstdio, cmath, cstdlib atd.). Dalšími jazyky s podobným přístupem k programování, jako má jazyk C jsou: programovací jazyk D a převládající implementace jazyka Python známá jako CPython.
Některé kompilátory (například GCC)[10] přikládají vlastní verze některých funkcí ze standardní knihovny jazyka C. To znamená, že funkce jsou zapsány přímo v kompilovaném objektovém souboru a program je volá namísto funkcí ve sdílené knihovně jazyka C. Vestavěné (anglicky builtin) funkce musí svým chováním respektovat standard ISO C.
Unixové systémy mají většinou zabudovanou sdílenou knihovnu jazyka C, ale ne vždy jsou v instalaci obsaženy hlavičkové soubory, takže je znemožněna tvorba aplikací v jazyce C. Knihovna jazyka C je v unixových systémech považována za součást operačního systému. Funkce jazyka C, včetně těch ze standardu ISO C, jsou často používány programy i operačním systémem, tím pádem by systémy s unixovým jádrem při absenci knihovny jazyka C nefungovaly.
Na systémech Microsoft Windows jádro dynamických knihoven (DLL) neobsahuje standardní knihovnu jazyka C – ta je obsažena zvlášť v jednotlivých kompilátorech. Programy vytvořené v programovacím jazyce C jsou buď staticky propojené s knihovnou jazyka C nebo jsou propojené s dynamickou verzí knihovny distribuovanou přímo s programem.
Seznam dalších nejznámějších implementací:
V tomto článku byl použit překlad textu z článku C standard library na anglické Wikipedii.
{{Cite web}}