A Szabványos C-könyvtár (C standard library), néha libc, a C programozási nyelv szabványos könyvtára, ahogyan azt az ISO C szabvány meghatározza.ISO/IEC (2018). ISO/IEC 9899:2018(E): Programming Languages - C §7 Az eredeti ANSI C szabványból kiindulva, a C POSIX könyvtárral egy időben fejlesztették ki, amely annak szuperhalmaza. Mivel az ANSI C-t a Nemzetközi Szabványügyi Szervezet elfogadta, a C standard könyvtárat ISO C library-nak is nevezik.

A C szabványos könyvtár makrókat, típusdefiníciókat és függvényeket biztosít olyan feladatokhoz, mint a karakterlánc-kezelés, a matematikai számítások, a be- és kimeneti feldolgozás, a memóriakezelés és input/output.

Alkalmazásprogramozási interfész (API) Fejléc fájlok A C szabványos könyvtár alkalmazásprogramozási interfésze (API) számos fejlécfájlban (header files) van deklarálva. Minden fejlécfájl egy vagy több függvénydeklarációt, adattípus-definíciót és makrókat tartalmaz.

A szabvány C nyelvre vonatkozó verziójának implementációja hosted vagy freestanding implementációként írható le. A tárolt implementáció a teljes szabványt támogatja, és megköveteli, hogy a szabványban meghatározott összes fejlécfájl jelen legyen; ezek jellemzően operációs rendszeren futó programok implementációi. Egy szabadon álló implementációnak nincs szüksége a C könyvtárban található nyelvi funkciók implementálására, kivéve azokat, amelyeket az operációs rendszer adott verziójában a szabadon álló implementációkban megkövetelnek; ezek jellemzően egy nagyon korlátozott operációs rendszeren vagy közvetlenül a hardveren futó programok implementációi.

Hosszú stabil időszak után három új fejlécfájl (, és ) került be az 1995-ben ratifikált C-szabvány Normative Addendum 1 (NA1) kiegészítésével. További hat fejlécfájl (, , , , és ) a C99, a C-szabvány 1999-ben közzétett módosításával, további öt fájl (, , , és ) a C11 2011-ben, és további két fájl ( és ) a 2023-ban megjelent C23-mal. Összesen most már 31 fejlécfájl van:

Név -tól Leírás Deklarálja az assert makrót, amely a program hibakeresése során a logikai és más típusú hibák felderítésére szolgál. C99 Meghatároz egy sor függvényt a komplex számok manipulálására. Meghatározza a karakterek típusuk szerinti osztályozásáraA C karakterosztályozás olyan műveletek csoportja a C szabványos könyvtárban, amelyek egy karaktert egy adott karakterosztályhoz való tartozásra tesztelnek; például ábécé, vezérlő stb. Az egybájtos és wide-karakterek egyaránt támogatottak. vagy a kis- és nagybetűk közötti konverzióra használt függvények halmazát a használt karakterkészlettől független módon (jellemzően ASCII vagy annak valamelyik kiterjesztése, bár ismertek EBCDIC-et használó implementációk is). A könyvtári függvények által jelentett hibakódok tesztelésére. C99 Meghatározza a lebegőpontos környezet vezérlésére szolgáló funkciókat. A lebegőpontos könyvtár megvalósítás-specifikus tulajdonságait meghatározó makro-állandók definiálása. C99 Meghatározza a rögzített szélességű egész szám típusokat. NA1 Számos makrót definiál, amelyek több szabványos token kifejezésének alternatív módjait valósítják meg. Az ISO 646 variáns karakterkészletekben történő programozáshoz. Makro-állandókat definiál, amelyek az egész szám típusok megvalósítás-specifikus tulajdonságait határozzák meg. Meghatározza a lokalizációs függvényeket. Definiálja az általános matematikai függvényeket. Deklarálja a és , makrókat, amelyeket a nem lokális kilépésekhez használnak. Meghatározza a jelkezelő funkciókat. C11 Az objektumok lekérdezéséhez és adatok igazításához. A függvényeknek átadott változó számú argumentum eléréséhez. C11 A szálak között megosztott adatokon végzett atomi műveletekhez. C23 Bájtrendezéshez és bitábrázoláshoz. C99 Boolean adattípust határoz meg. C23 Makrókat definiál az ellenőrzött egészértékű aritmetikához. C29 Egy tömb hosszának lekéréséhez a függvénnyel. Számos hasznos típust és makrót definiál. C99 Rögzített szélességű egész számtípusokat határoz meg. Meghatározza az alapvető bemeneti és kimeneti funkciókat. Numerikus konverziós függvények, pszeudo-véletlen számok generálására szolgáló függvények, memóriaelosztás, folyamatvezérlő függvények definiálása. C29 Szövegátkódoló segédprogramokat biztosít. C11 Nem visszatérő függvények megadásához. Meghatározza a karakterlánc-kezelő függvényeket. C99 Típus-generikus matematikai függvények definiálása. C11 Több szál, mutexekAz informatikában a kölcsönös kizárás (mutual exclusion) az egyidejűség-szabályozás egyik tulajdonsága, amelyet a versenyfeltételek megelőzése céljából hoztak létre. és feltételváltozók kezelésére szolgáló függvények definiálása. Meghatározza a dátum- és időkezelési funkciókat. C11 Unicode karakterek manipulálására szolgáló típusok és függvények. NA1 wide-string kezelő funkciókat határoz meg. NA1 Meghatározza a széles karakterek típus szerinti osztályozására vagy a kis- és nagybetűk közötti konverzióra használt függvények készletét.

A fejlécfájlok közül három (, és ) olyan feltételes funkciókat tartalmaz, amelyeket az implementációknak nem kell támogatniuk.

A POSIX szabvány számos nem szabványos C fejléccel egészítette ki a Unix-specifikus funkciókat. Sokuk átkerült más architektúrákba is. Ilyen például az és az . Számos más csoport más nem szabványos fejléceket is használ – a GNU C library rendelkezik az -val, az OpenVMS pedig a függvénnyel.

Dokumentáció Unix-szerű rendszereken az API hiteles dokumentációja man-oldalak formájában érhető el. A legtöbb rendszeren a szabványos könyvtári függvényekről szóló man oldalak a 3. fejezetben találhatók; a 7. fejezet tartalmazhat néhány általánosabb lapot a mögöttes fogalmakról (pl. Linuxon).

Megvalósítások A Unix-szerű rendszerek általában rendelkeznek C könyvtárral megosztott könyvtár formájában, de a fejlécfájlok (és a fordító eszköztár) hiányozhatnak a telepítésből, így a C fejlesztés nem feltétlenül lehetséges. A C könyvtár a Unix-szerű rendszereken az operációs rendszer részének tekinthető; a C szabvány által meghatározott funkciók mellett más, az operációs rendszer API-jának részét képező funkciókat is tartalmaz, például a POSIX szabványban meghatározott funkciókat. A C könyvtári függvényeket, beleértve az ISO C szabványos függvényeket is, a programok széles körben használják, és úgy tekintik őket, mintha nem csak a C nyelvben lévő valaminek az implementációját, hanem de facto az operációs rendszer interfészének a részét képeznék. A Unix-szerű operációs rendszerek általában nem tudnak működni, ha a C könyvtárat törlik. Ez azokra az alkalmazásokra igaz, amelyek dinamikusan, nem pedig statikusan linkeltek. Továbbá maga a kernel (legalábbis a Linux esetében) könyvtáraktól függetlenül működik.

A Microsoft Windows rendszerben az alaprendszer dinamikus könyvtárai (DLL-ek) a Microsoft Visual C++ v6.0 fordítóhoz tartozó C szabványkönyvtár implementációját biztosítják; a Microsoft Visual C++ fordító újabb verzióihoz tartozó C szabványkönyvtárat az egyes fordítók külön-külön, valamint az újraforgalmazható (redistributable) csomagok biztosítják. A C nyelven lefordított alkalmazásokat vagy statikusan összekapcsolják egy C könyvtárral, vagy a könyvtár dinamikus verziójával likelik, amelyet az alkalmazásokkal együtt szállítanak, ahelyett, hogy arra támaszkodnának, hogy a célrendszereken jelen legyen. A fordító C könyvtárában található függvények nem tekinthetők a Microsoft Windows interfészének; a Windows rendszer interfészei a C futásidejű könyvtártól elkülönített könyvtárakban találhatók.

Számos C szabványos könyvtár implementáció létezik, amelyeket különböző operációs rendszerek és C fordítóprogramok egyaránt biztosítanak. A népszerű implementációk közül néhány a következő: A libc, a BSD-alapú operációs rendszerekkel együtt terjesztett különböző implementációk GNU C library (glibc), amelyet a GNU Hurd, GNU/kFreeBSD, és a legtöbb Linux disztribúció használ Microsoft C futásidejű könyvtár, a Microsoft Visual C++ része. A könyvtárnak két változata létezik: Az MSVCRT, amely a v12 / Visual Studio 2013-ig újraosztható volt, alacsony C99-megfelelőséggel, és egy új, UCRT (Universal C Run Time), amely a Windows 10 és 11 része, így mindig jelen van a linkeléshez, és szintén C99-kompatibilis . dietlibc, a C szabványos könyvtár egy alternatív kis implementációja (MMU nélküli) μClibc, egy C szabványú könyvtár beágyazott μClinux rendszerekhez (MMU nélkül) uclibc-ng, egy beágyazott C könyvtár, a μClibc elágazása, továbbra is karbantartott, memóriakezelő egység (MMU) támogatással Newlib, beágyazott rendszerekhez készült C szabványos könyvtár (MMU nélkül) és a Cygwin GNU Windows disztribúcióban használatos klibc, elsősorban Linux rendszerek indításához musl, egy másik könnyített C szabványos könyvtár implementáció Linux rendszerekre Bionic, eredetileg a Google által az Android beágyazott operációs rendszerhez fejlesztett, a BSD libc-ből származik. picolibc, Keith Packard által kifejlesztett, kis beágyazott rendszereket céloz meg, korlátozott RAM-mal, a Newlib és az AVR Libc kódján alapul llvm-libc a C szabványos könyvtár nulláról készült implementációja, amelyet az LLVM projekt részeként fejlesztettek ki.

Fordítók beépített függvényei Egyes fordítóprogramok (például a GCC) a C szabványos könyvtár számos függvényének beépített változatát biztosítják; azaz a függvények implementációi a lefordított object-fájlba kerülnek, és a program a beépített változatokat hívja meg a C könyvtár megosztott objektumfájljában lévő függvények helyett. Ez csökkenti a függvényhívások többletköltségét, különösen, ha a függvényhívásokat inline változatokkal helyettesítjük, és lehetővé teszi az optimalizálás más formáit (mivel a fordító ismeri a beépített változatok vezérlés-áramlási jellemzőit), de zavarokat okozhat a hibakeresés során (például a beépített változatok nem helyettesíthetők instrumentált változatokkal).

A beépített függvényeknek azonban úgy kell viselkedniük, mint az ISO C szabványnak megfelelő közönséges függvényeknek. A fő következmény az, hogy a programnak képesnek kell lennie arra, hogy a függvények címét átvéve mutatót hozzon létre ezekre a függvényekre, és ezen mutató segítségével hívja meg a függvényt. Ha a program két különböző fordítási egységében ugyanarra a függvényre mutató két mutatót származtatunk, akkor a két mutatónak egyenlőnek kell lennie, azaz a cím a függvény nevének feloldásával jön létre, amely külső (programszintű) hivatkozással rendelkezik.

Linking, libm A FreeBSD és a glibc alatt néhány függvény, például a alapértelmezés szerint nincs linkelve, helyette a libm matematikai könyvtárba van csomagolva. Ha bármelyiküket használjuk, a linkernek meg kell adni a direktívát. A POSIX megköveteli, hogy a c99 fordító támogassa az opciót, és hogy a , és fejlécekben deklarált függvények elérhetőek legyenek a linkeléshez, ha a opciót megadjuk, de azt nem írja elő, hogy a függvények alapértelmezés szerint linkelve legyenek. A musl úgy tesz eleget ennek a követelménynek, hogy mindent egyetlen libc könyvtárba helyez, és egy üres libm-et biztosít.

Detektálás A C szabvány szerint a makrót 1-re kell definiálni, ha az implementáció hosztolt. A hosztolt implementáció rendelkezik a C-szabvány által meghatározott összes fejléccel. Az implementáció lehet szabadonálló (freestanding) is, ami azt jelenti, hogy csak azok a fejlécek vannak garantáltan jelen, amelyeknek a szabvány egy önálló implementációjának részét kell képezniük. Ha a megvalósítás önálló, akkor a freestanding értékét 0-ra kell definiálni.

Problémák és megoldások Puffer túlcsordulási sebezhetőségek A C szabványos könyvtár néhány függvénye az elfogadásuk óta hírhedt arról, hogy puffertúlcsordulási sebezhetőségeket tartalmaznak, és általában hibás programozásra ösztönöznek.A jól ismert sebezhetőségét kihasználó Morris-féreg már 1988-ban elkészült. A legtöbbet kritizált tételek a következők: