Standardní knihovna C.

Standardní knihovna of C je nyní standardizovaná sbírku záhlaví a rutin používaných při provádění běžných operací, jako je například vstup / výstup a řídící řetězce v jazyce C. Na rozdíl od jiných jazyků, jako je Pascal a PL / I , C neobsahuje klíčová slova pro tyto úkoly , takže téměř všechny programy napsané v jazyce C používají standardní knihovnu, i když jen k zobrazení výsledku.

Architektura

Název a podpis („prototyp“ v C) každé funkce jsou popsány v záhlavích, která jsou součástí zdrojového kódu , zatímco objektový kód funkcí je oddělen v softwarové knihovně , která bude propojena pouze se zdrojovým kódem . Zbytek programu pouze tehdy, když spojuje . Název a jmenný prostor hlaviček se staly běžnými. Každá hlavička je nejčastěji samostatný soubor , ale organizace implementací zůstává různorodá. Standardní knihovna původně přišla s kompilátorem , ale dnes je často součástí operačního systému . V systémech Unix se obvykle nachází v adresáři /usr/lib/a je pojmenován po libc.anebo libc.so ; hlavičkové soubory jsou v adresáři /usr/include. Kompilátor však vždy ví, kde jsou tyto soubory umístěny, takže to není třeba říkat.

V systému Linux se obvykle používá knihovna glibc ; v systému Windows se obvykle nazývá standardní knihovna Visual C ++MSVCR*.dll , protože je k dispozici nezávisle na použitém kompilátoru C. Protože překladače jazyka C často nabízejí více funkcí než ty, které specifikují normy ISO a POSIX C , je standardní knihovna dodávaná s konkrétním překladačem špatně kompatibilní se standardními knihovnami jiných překladačů pro funkce, které nejsou standardizovány.

Zkušenosti ukazují, že většina standardní knihovny C byla dobře navržena. Některé části s odstupem času se však zdají být chybami. Funkce čtení řádku getsa použití scanfke čtení vstupních řetězců jsou zdrojem mnoha přetečení vyrovnávací paměti a většina průvodců programováním doporučuje vyhnout se jejich použití. Další oldie je strtok, funkce navržená jako primitivní lexikální analyzátor, ale která je docela „křehká“ a obtížně použitelná. Nakonec je správa dat a časů primitivní, zejména s virtuální nemožností správy časových pásem.

Dějiny

Unix a programovací jazyk C byly vytvořeny laboratořemi AT & T a Bell (Bell Laboratories společnosti AT&T) na začátku 70. let . Primitivní jazyk C neposkytl vestavěné funkce, jako je I / O operací (na rozdíl od klasických jazyků, jako je Pascal a Fortran ). V průběhu času komunity uživatelů C sdílely nápady a implementace toho, co nyní nazýváme standardní knihovnou C, aby tyto funkce poskytly. Mnoho z těchto myšlenek bylo začleněno do standardizované definice programovacího jazyka C.

V 70. letech se C stala populární. Mnoho univerzit a organizací vytvořilo pro své projekty vlastní varianty tohoto jazyka. V 80. letech se objevily problémy s kompatibilitou mezi různými implementacemi C.

Normy ANSI a ISO

V roce 1983 American National Standards Institute (ANSI) vytvořený výbor stanovit standardní specifikaci pro C, známý jako „ANSI C“. Tato práce vyvrcholila vytvořením standardu C89 v roce 1989 . Část výsledného standardu byla sada funkcí knihovny nazývá standardní ANSI C knihovny ( ANSI C standardní knihovna ). Tato norma se stala mezinárodní normou v roce 1990 a je známá také jako ISO C (ISO C) .

Pozdější revize normy ISO C přidaly do knihovny nové funkce a záhlaví. Podpora těchto rozšíření se liší podle implementace. Headers <iso646.h>, <wchar.h>a <wctype.h>byla přidána s normativní změnou 1 ( Normativní změna 1 ), dále zkrácenou změnou 1 , která je dodatkem ke standardu C ratifikovanému v roce 1995 . Záhlaví <complex.h>, <fenv.h>, <inttypes.h>, <stdbool.h>, <stdint.h>a <tgmath.h>byly přidány s C99, revize standardu C, publikované v roce 1999 .

Knihovna standardů ISO C se skládá z 24 hlaviček, které lze zahrnout do programátorského projektu s jedinou směrnicí. Každá hlavička obsahuje prototypy funkcí, definice typů a makra. Obsah těchto záhlaví je popsán níže.

Rozšíření

Ve srovnání s jinými jazyky (např. Java ) je standardní ISO knihovna C malá. Poskytuje základní sadu matematiky, manipulace s řetězci , převod typů a funkce vstupu a výstupu souboru a terminálu. Nezahrnuje standardní základnu „typů kontejnerů“ ani standardní knihovnu šablon v jazyce C ++ . Ponechává stranou grafická uživatelská rozhraní (GUI), síťové nástroje, synchronizační funkce mezi úkoly a množství dalších funkcí, které Java standardně poskytuje. Hlavní výhodou malé standardní knihovny je, že je mnohem snazší poskytnout pracovní prostředí pro C ISO než pro jiné jazyky, a portování aplikací v jazyce C na nové platformy je proto relativně rychlé.

Mnoho dalších knihoven bylo napsáno s cílem vyvinout funkčnost ekvivalentní funkcím poskytovaným jinými jazyky v jejich standardní knihovně. Například navrhované desktopové prostředí GNOME vyvinulo Box Tools GIMP (GIMP ToolKit, GTK) a GLib , knihovnu, která obsahuje kontejnery datových struktur, a existuje mnoho dalších známých vlastností. Z této řady dostupných knihoven ukázaly některé sady nástrojů v průběhu času vynikající schopnosti. Hlavní nevýhodou je, že často spolu příliš dobře nefungují, programátoři jsou často nuceni žonglovat s několika různými knihovnami a některé funkce mohou být v různých formách pod každou konkrétní platformou, někdy dokonce i v rámci jedné důležité software.

Záhlaví knihovny ISO C

<assert.h> Obsahuje makro assert, které se používá k detekci nekonzistencí dat a jiných typů chyb při ladění verzí programu. <complex.h> Zvládání komplexních čísel (zavedeno C99). <ctype.h> Funkce používané k rychlé klasifikaci znaků nebo k převodu mezi velkými a malými písmeny nezávisle na použitém systémovém kódování znaků (znakové sadě) ( ASCII , ISO / IEC 8859-1 , EBCDIC atd.). <errno.h> Sada (nebo nejčastěji podmnožina) chybových kódů vrácených funkcemi standardní knihovny prostřednictvím proměnné errno. <fenv.h> Kontrolovat environmentální plovák (s plovoucí desetinnou čárkou) (zavedený C99). <float.h> Obsahuje konstanty, které určují vlastnosti čísel s plovoucí desetinnou čárkou, které závisí na implementaci, například minimální rozdíl mezi dvěma různými čísly s plovoucí desetinnou čárkou (xxx_EPSILON), maximální počet přesných číslic (xxx_DIG) a interval čísel, která lze reprezentovat ( xxx_MIN, xxx_MAX). <inttypes.h> Pro přesné převody mezi celočíselnými typy (zavedeno C99). <iso646.h> Programovat se znakovou sadou ISO 646 (zavedeno Amd.1). <limits.h> Obsahuje konstanty, které určují vlastnosti celočíselných typů, které jsou závislé na implementaci, například rozsahy čísel, která lze reprezentovat (xxx_MIN, xxx_MAX). <locale.h> Přizpůsobit se různým kulturním konvencím. <math.h> Výpočet běžných matematických funkcí. C99 přidal mnoho matematických funkcí, zejména ke konvergenci s normou IEC 559 známou také jako IEEE 754 . <setjmp.h> Provádět gotonelokální pokyny (druhy výjimek ). <signal.h> Ovládat signály (výjimečné podmínky vyžadující okamžité zpracování, např. Uživatelský signál). <stdarg.h> Vytvářet funkce s proměnným počtem argumentů. <stdbool.h> Mít jakýsi booleovský typ (zavedený C99). <stddef.h> Definuje několik užitečných typů a maker, například NULL. <stdint.h> Definuje různé typy celých čísel, jedná se o podmnožinu inttypes.h (zavedené C99). <stdio.h> Poskytuje základní vstupní / výstupní funkce jazyka C, například funkce printf. <stdlib.h> Provádět různé operace včetně převodu, generování pseudonáhodných čísel, přidělování paměti, řízení procesů, správy prostředí a signálů, vyhledávání a třídění. <string.h> Zpracování řetězců znaků . <tgmath.h> Pro matematické operace s generickými typy (zavedeno C99). <threads.h> Implementuje správu vláken jako standard libc (zavedený C11) <time.h> Pro převod mezi různými formáty data a času. <wchar.h> Ke zpracování velkých znaků (široký znak) je nutné podporovat velký počet jazyků, zejména Unicode (zavedený Amd.1). <wctype.h> Pro klasifikaci širokých znaků (zavedeno Amd.1).

Standardní knihovna v C ++

C ++ programovací jazyk převezme funkci standardní knihovny ISO C, ale provádí několik změn, například transformaci jména hlaviček z <xxx.h>k <cxxx>(ovšem názvy ve stylu C jsou stále k dispozici, i když zastaralé) a umístěte všechny identifikátory do jmenného prostoru (jmenného prostoru) std.

Poznámky

  1. Viz PJ Plauger , The Standard C Library , Prentice Hall,1992( ISBN  0-13-838012-0 ) , „Úvod“, xi : „  Design knihovny Standard C je pevný. Přesto je to v mnoha ohledech dobrý design ...  “
  2. Plauger (cit. Dílo, kap. 14, s.  386 ) připouští: „  Co byste možná nečekali, je několik designových výpadků ve funkcích [string.h]; Funkce deklarované v <string.h> nejsou výsledkem společného návrhu. […] V době, kdy začalo úsilí o standardizaci C, bylo příliš pozdě na „opravu“.  "
  3. Viz například práce Claude Delannoy , Programmer en langue C , Eyrolles,2005( ISBN  978-2-212-12546-7 ) , str.  151, kde autor doporučuje kombinované použití funkcí get a sscanf, aby se zabránilo neúspěchům způsobeným voláním scanf.
  4. Srov. Znovu Plauger (cit. Dílo, kap. 14, s.  405 ): „  Funkce strtok je poslední a nejsmutnější ze sedmi funkcí skenování řetězců.  "

Podívejte se také

Bibliografie

  • Brian Kernighan a Dennis Ritchie ( překládali  Jean-François Groff a Éric Mottier), Le langue C - C ANSI [„  Programovací jazyk C  “], Paříž, Masson ,1990, 2 nd  ed. , 280  s. [ detail vydání ] ( ISBN  2-225-82070-8 ), Příloha B Standardní knihovna , s.  245-264
  • Mezinárodní skupina pro normalizaci pro programovací jazyk C ,
    • (en) ISO / IEC 9899: TC2 WG14 / N1124 , „Návrh výboru“, 6. května 2005 [ číst online ] Nejnovější návrh ISO C99 včetně technické opravy 2
    • (en) ISO / IEC 9899: TC3 WG14 / N1256 , „Návrh výboru“, 7. září 2007 [ číst online ] Nejnovější návrh ISO C99 včetně technické opravy 3

Implementace

externí odkazy