C Standard Library

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2021. június 17-én felülvizsgált verziótól ; az ellenőrzések 6 szerkesztést igényelnek .

A C szabványkönyvtár (más néven libc , crt ) az ANSI C szabvány azon része, amely a fejlécfájloknak és a könyvtári rutinoknak van szentelve . Az általános műveletek végrehajtásának leírása, mint például az I/O és a karakterlánc -feldolgozás a C programozási nyelven . A C Standard Library egy programozási felület leírása , nem pedig a fordítási folyamatban használható valódi könyvtár .

Szerkezet

Az egyes függvények nevét és jellemzőit egy fejlécfájlnak nevezett fájl adja meg , de a függvények aktuális megvalósítása külön egy könyvtárfájlban van leírva . A fejlécfájlok nevei és képességei általánossá válnak, de a könyvtárak felépítése továbbra is heterogén. A szabványos könyvtár általában a fordítóval érkezik . Mivel a C fordítók gyakran olyan kiterjesztett funkciókat biztosítanak, amelyeket az ANSI C szabvány nem határoz meg, az egyik fordító szabványos könyvtára nem kompatibilis más fordítók szabványos könyvtáraival.

Vélemények a szerkezetről

A C standard könyvtár nagy része jól megtervezettnek tűnik. A múltban előnyösnek bizonyult egyes alkatrészek hibásak lehetnek. A karakterlánc-beviteli funkciók gets()(és a scanf()bemeneti karakterláncok beolvasása) számos puffertúlcsordulás forrása , ezért a legtöbb programozási útmutató azt tanácsolja, hogy kerülje el ezeket a trükköket. A funkció strcpy()is meglehetősen hírhedt. Egy másik kétértelmű funkció strtok() - egy egyszerű lexikális elemzőnek tervezett funkció , de sok "csapdával" van, ezért nagyon nehéz használni.

Az a választás, hogy a típus size_thelyett inta megadott számú elemet használjuk, fread()és fwrite()nincs összhangban a számára size_t(a bájtok számának megjelenítésére) kifejlesztett általános szemantikával.

stdiomeglehetősen korlátozott (túl magas szint ahhoz, hogy sok helyzetben használható legyen), és a szabvány nem teszi lehetővé a felhasználó számára, hogy saját maga módosítsa vagy bővítse tulajdonságait. Ennek eredményeként sok alkalmazás saját burkolókönyvtárat fejleszt az operációs rendszer által megvalósított alacsonyabb szintű mechanizmusok és funkciók köré, mint például a POSIX . Például stdionem működnek olyan jelekkel vagy aszinkron , nem sorozatos I/O módokkal, amelyeket széles körben használnak a hálózati szervereken. Ennek eredményeként a funkciókra stdiocsak a teljes folyamatmodellt használó szerverek támaszkodhatnak, hogy a kliens a POSIX -kompatibilis rendszereken kötegelt I/O-ban szolgálja ki azokat.

A többszálú alkalmazások fejlesztésekor kerülni kell a szabványos könyvtár bizonyos jellemzőit . A szálvezérlő primitíveket az operációs rendszer többi részére szánták, és figyelmen kívül hagyják az olyan általános szabványokat, mint a POSIX szálkönyvtár, és elvárják, hogy a C programozók maguk gondoskodjanak róla, újrafelhasználással és szinkronizálással dolgozva. Sem a C nyelv, sem a szabványos könyvtára semmilyen módon nem ellenőrzi az ilyen rendszerspecifikus eredményeket.

Történelem

A C programozási nyelv a szabványosítás előtt nem biztosított olyan beépített funkciókat, mint például az I/O műveletek (ellentétben a hagyományos nyelvekkel, mint például a Cobol és a Fortran ). Később a C programozói közösségben olyan ötletek születtek, amelyeket a ma C Standard Library -nek hívunk , hogy támogassák ezt a funkciót. Ezen ötletek többsége végül összeállt a C programozási nyelv szabványának meghatározásához.

A Unixot és a C -t is az AT&T Bell Laboratories -jában hozták létre az 1960-as évek végén és az 1970-es évek elején. Az 1970-es években a C programozási nyelv hihetetlenül népszerűvé kezdett válni. Sok egyetem és szervezet megkezdte saját nyelvváltozatának létrehozását, amely jobban megfelel saját igényeinek. Az 1980-as évek eleje óta a C nyelv különböző implementációi közötti kompatibilitási problémák túlságosan nyilvánvalóvá váltak. 1983- ban az Amerikai Nemzeti Szabványügyi Intézet (ANSI) bizottságot hozott létre a C nyelv szabványának elfogadására, amely "ANSI C" néven ismert. Ennek eredményeként 1989 - ben megszületett az úgynevezett C89 szabvány . Az így létrejött szabvány része volt az ANSI C Standard Library nevű könyvtárkészlet .

A C nyelvi szabvány későbbi verziói néhány új és hasznosabb fejlécfájlt adtak a könyvtárhoz. Az új bővítmények támogatása a megvalósítástól függött.

Az <iso646.h> , <wchar.h> és <wctype.h> fejlécfájlokat az 1. függelékben (rövidítve NA1 ) adtuk hozzá, az 1995 -ben ratifikált C szabványhoz .

A <complex.h> , <fenv.h> , <inttypes.h> , <stdbool.h > , <stdint.h> és <tgmath.h> fejlécfájlok a C99 -ben, a C szabvány egyik változatában kerültek hozzáadásra 1999 -ben jelent meg .

ANSI szabvány

Az ANSI C szabványkönyvtár 24 fejlécfájlból áll, amelyek mindegyike egyetlen direktívával beépíthető egy szoftverprojektbe. Minden fejlécfájl egy vagy több függvénydeklarációt, adattípus-definíciót és makrót tartalmaz. Ezeknek a fejlécfájloknak a tartalma alább látható.

Néhány más nyelvhez (például a Java -hoz ) képest a szabványos könyvtár rendkívül kicsi. A könyvtár támogatja a matematikai függvények alapkészletét, a karakterlánc-feldolgozást, a típuskonverziót, a fájl- és konzol I/O-t. Nem tartalmaz szabványos "tárolótípusok" készletet, mint például a C++ szabványos sablonkönyvtár , a grafikus felhasználói felülettel (GUI) való munkavégzéshez szükséges komponenseket , a hálózatépítést és egyéb, a Java által szabványosan támogatott különféle funkciókat. A kis szabványos könyvtár fő előnye, hogy megkönnyíti az ANSI C környezettel való munkát, mint más nyelvekkel, és ezáltal könnyebben portolható át a C programok új platformokra.

Sok más könyvtárat fejlesztettek ki, hogy támogassa a más nyelvek által biztosított hasonló funkciókat a szabványos könyvtárakban. Például a GNOME asztali környezet fejlesztési projektje kifejlesztette a GTK+ és GLib grafikus eszközkészletet  , egy konténeradat-struktúrák könyvtárát, valamint sok más jól ismert példát. A rendelkezésre álló könyvtárak sokfélesége azt jelenti, hogy egyes legfelső szintű eszközök idővel hasznosnak bizonyultak. Jelentős hátránya, hogy gyakran nem működnek jól egymással, így a programozók gyakran jobban hozzá vannak szokva ahhoz, hogy különböző könyvtárkészletekkel dolgozzanak, és készleteik különböző konkrét platformokon is elérhetők lehetnek.

ANSI C könyvtár fejléc fájlok C99 és C11 kiegészítéssel

< assert.h > Tartalmazza az állítás makrót , amely a hibakeresés alatt álló program verziójában a logikai és néhány egyéb típusú hibának észlelésére szolgál.
< összetett.h > Függvénykészlet komplex számokkal való munkavégzéshez . ( C99 -ben bemutatva )
< ctype.h > Olyan függvényeket tartalmaz, amelyek a karakterek típusuk szerinti osztályozására vagy a kis- és nagybetűk közötti konvertálásra szolgálnak, függetlenül a használt kódolástól (általában ASCII vagy annak valamelyik kiterjesztése, bár vannak olyan implementációk, amelyek EBCDIC -t használnak ).
< errno.h > A könyvtári funkciók által visszaadott hibakódok ellenőrzése.
< fenv.h > Lebegőpontos számokat használó környezet vezérléséhez . ( C99 -ben bemutatva )
< float.h > Előre definiált konstansokat tartalmaz, amelyek leírják a lebegőpontos számokkal való munkavégzéshez szükséges könyvtári tulajdonságok megvalósítási sajátosságait , például a két különböző lebegőpontos szám közötti minimális különbséget (_EPSILON), a precíziós számjegyek maximális számát (_DIG) és az érvényes számok tartományát ( _MIN, _MAX ).
< inttypes.h > Egész típusok pontos konvertálásához. ( C99 -ben bemutatva )
< iso646.h > ISO 646 kódolású programozáshoz . (Megjelent az NA1 -ben )
< limits.h > Előre meghatározott konstansokat tartalmaz, amelyek meghatározzák az egész típusú tulajdonságok megvalósítási sajátosságait, például az érvényes értékek tartományát (_MIN, _MAX).
< locale.h > A setlocale()-hez és a kapcsolódó konstansokhoz. A megfelelő nyelv kiválasztására szolgál .
< math.h > Az alapvető matematikai függvények kiszámításához
< setjmp.h > Makrókat deklarál setjmp, és longjmpnem helyi ugrásokhoz használja
< jel.h > A jelfeldolgozás vezérlésére
< stdarg.h > A függvényeknek átadott különböző számú argumentum elérése.
< stdbool.h > Logikai adattípusokhoz. ( C99 -ben bemutatva )
< stdint.h > Különböző típusú egész számok meghatározása. ( C99 -ben bemutatva )
< stddef.h > Több szabványos típus és makró meghatározása.
< stdio.h > Alapvető bemeneti és kimeneti képességeket valósít meg C nyelven. Ez a fájl egy nagyon fontos funkciót tartalmaz printf.
< stdlib.h > Különféle műveletek végrehajtása, beleértve az átalakítást, az álvéletlen számok generálását , a memóriafoglalást, a folyamatvezérlést, a környezetvezérlést, a jeleket, a keresést és a rendezést.
< string.h > Különféle húrokkal való munkavégzés.
< tgmath.h > Tipikus matematikai függvényekhez. ( C99 -ben bemutatva )
< szálak.h > A <threads.h> fejléc és az <stdatomic.h> támogatja a párhuzamos programozást. (Bevezetve a C11 -ben )
< idő.h > A különböző idő- és dátumformátumok közötti konvertáláshoz.
< wchar.h > "Széles" adatfolyamok és többféle karakterlánc kezelése "széles" karakterek használatával (nyelvkészlet támogatása). (Megjelent az NA1 -ben )
< wctype.h > A "széles" karakterek osztályozása. (Megjelent az NA1 -ben )

A C Standard Library más nyelveken

Egyes nyelvek saját könyvtárakkal biztosítják a C standard könyvtár funkcióit. A könyvtár adaptálható a nyelv struktúráihoz, de a műveletek szemantikája hasonló marad. A C++ programozási nyelv például az ANSI C szabványkönyvtár funkcióit tartalmazza az std névtérben ( pl. , stb. ), a hasonló C nevű fejlécfájlokban (" "", " " ", " " stb.) ..). Más nyelvek, amelyek hasonló megközelítést alkalmaznak, például a D és a Python . Utóbbiban például a beépített objektumfájlt úgy definiáljuk, hogy "a C csomag stdio implementálja" [1] , így a rendelkezésre álló műveletek (nyitás, olvasás, írás stb.) a megfelelő C-hez hasonlóan fognak viselkedni. nyelvi funkciók. std::printfstd::atoistd::feofcstdiocmathcstdlib

Általános könyvtári támogatás

Még nem szabványosított, de a C programok függhetnek az alprogramok könyvtáraitól, amelyek a fordító által futás közben használt kódot tartalmaznak. A kód, amely inicializálja az operációs rendszer folyamatát, például a hívás előtt main(), a fordító ezen verziójának C Run-Time Library-jában (CRT) valósul meg. A CRT-könyvtár kódja segíthet más nyelvi funkciók megvalósításában, például a nem elkapott kivételek kezelésében vagy a lebegőpontos számok megvalósításában.

A C Standard Library csak a fenti szubrutinok jelenlétét és viselkedését szabályozza. Mivel a fordító megvalósítása függhet ezeknek a kiegészítő funkcióknak a meglététől, minden attól függ, hogy mely rutinokat fordítják a C Standard Library-be, így minden velük fejlesztett programnak szüksége lesz rájuk.

Bár kötegelésük miatt gyakran összekeverik a C Standard Library-vel, a CRT-könyvtár nem szabványosított része a nyelvnek, és a szoftver szállítási módjától függ.

A fordító jellemzői

Egyes fordítók (pl . GCC [1] ) támogatják a C Standard Library számos funkciójának belső verzióját; vagyis a függvénymegvalósítások a lefordított objektummodulba vannak írva , és a program a belső verziókat hívja meg a megosztott C könyvtári függvények helyett. Ez csökkenti a függvényhívási költségeket, különösen, ha a függvényhívást beépített változatok váltják fel, és az optimalizálás egyéb formái is megengedettek (ha a fordító támogatja a belső változatok jellemzőinek szabályozását ), de hibakeresési problémákhoz vezethet (pl. belső verziók esetén). nem helyettesíthető szerszámverziókkal ).

POSIX Standard Library

A POSIX (és a SUS ) számos olyan szubrutint határoz meg, amelyek a C szabványkönyvtárban meghatározottakon kívül is elérhetők lehetnek; gyakran a szabványos könyvtárhoz hasonló funkcionalitást valósítanak meg, különböző mértékű hasonlósággal. Például a glibc olyan függvényeket valósít meg, mint a fork a libc.so-ban, de a streaming függvénytárak a hívás előtt egyesülnek a glibc-be, még akkor is, ha azt külön könyvtárként hirdetik saját linker jelzővel. Az ilyen POSIX-kompatibilis funkciókat gyakran a könyvtár részének tekintik; így a megfelelő C könyvtár ANSI vagy ISO C könyvtárként azonosítható.

Megvalósítások

Számos megvalósítás létezik különféle operációs rendszerekkel és C-fordítókkal. A BSD rendszereken például a rendszerkönyvtár be van építve az operációs rendszerbe, és egy megosztott forrástároló karbantartja. A legtöbb rendszeren a könyvtár " libc" néven található.

Bár számos megvalósítás létezik, itt van egy kis lista a legnépszerűbb könyvtárakról:

Lásd még

Linkek

  1. A GCC által biztosított egyéb beépített funkciók archiválva 2008. december 11-én a Wayback Machine -nél , GCC Guide
  2. Re: A Newlib támogatja az mmu nélküli processzorokat? (nem elérhető link) . Letöltve: 2008. október 3. Az eredetiből archiválva : 2008. november 22.. 
  3. musl - Bevezetés . www.musl-libc.org. Letöltve: 2017. január 30. Az eredetiből archiválva : 2020. november 12.

További források