Biblioteca standard C (cunoscută și ca libc , crt ) este partea standardului ANSI C dedicată fișierelor antet și rutinelor bibliotecii . Este o descriere a implementării operațiunilor comune, cum ar fi I/O și procesarea șirurilor în limbajul de programare C. Biblioteca C Standard este o descriere a unei interfeţe de programare , nu o bibliotecă adevărată utilizabilă în procesul de compilare .
Numele și caracteristicile fiecărei funcții sunt specificate într-un fișier numit fișier antet , dar implementarea curentă a funcțiilor este descrisă separat într-un fișier de bibliotecă . Numele și capacitățile fișierelor antet devin comune, dar organizarea bibliotecilor este încă eterogenă. Biblioteca standard vine de obicei cu compilatorul . Deoarece compilatoarele C oferă adesea funcționalități extinse care nu sunt definite de standardul ANSI C , biblioteca standard a unui compilator este incompatibilă cu bibliotecile standard ale altor compilatoare.
O mare parte din biblioteca standard C pare a fi bine concepută. Unele dintre părțile individuale care au fost avantajoase în trecut pot fi predispuse la bug-uri. Funcțiile de introducere a șirurilor gets()(și utilizarea scanf()pentru a citi șirurile de intrare) sunt sursa multor depășiri de buffer , așa că majoritatea ghidurilor de programare vă sfătuiesc să evitați aceste trucuri. Caracteristica strcpy()este, de asemenea, destul de infamă. O altă funcție ambiguă este strtok() - o funcție concepută ca un simplu analizor lexical , dar având multe „capcane” și, prin urmare, foarte greu de utilizat.
Alegerea de a utiliza tipul size_tîn loc de intpentru numărul de elemente specificat pentru fread()și fwrite()este inconsecventă cu semantica generală dezvoltată pentru size_t(pentru a reprezenta numărul de octeți).
stdioeste destul de limitat (nivel prea ridicat pentru a fi utilizat în multe situații) și standardul nu permite utilizatorului să-și reatribuie sau să-și extindă proprietățile. Ca rezultat, multe aplicații își dezvoltă propriile biblioteci de wrapper în jurul mecanismelor și funcțiilor de nivel inferior implementate de sistemul de operare, cum ar fi POSIX . De exemplu, stdioele nu funcționează cu semnale sau cu moduri I/O asincrone non-burst care sunt utilizate pe scară largă în serverele de rețea. Ca rezultat, funcțiile stdiopot fi bazate pe deplin numai de către servere care utilizează întregul model de proces pentru ca clientul să le servească pe sisteme compatibile cu POSIX în I/O batch.
Anumite caracteristici ale bibliotecii standard ar trebui evitate atunci când se dezvoltă aplicații multithreaded . Primitivele de control ale firelor au fost destinate pentru restul sistemului de operare și ignoră standardele comune precum biblioteca de fire POSIX, așteptându-se ca programatorii C să se ocupe singuri de el, lucrând cu reutilizare și sincronizare. Nici limbajul C, nici biblioteca sa standard nu verifică în vreun fel astfel de rezultate specifice sistemului.
Limbajul de programare C , înainte de standardizare, nu a furnizat funcționalități încorporate, cum ar fi operațiunile I/O (spre deosebire de limbajele tradiționale, cum ar fi Cobol și Fortran ). Mai târziu, în comunitatea de programare C s-au născut idei care au fost implementate în ceea ce numim acum Biblioteca C Standard pentru a susține această funcționalitate. Cele mai multe dintre aceste idei s-au reunit în cele din urmă pentru a defini standardul limbajului de programare C.
Atât Unix , cât și C au fost create la laboratoarele Bell de la AT&T la sfârșitul anilor 1960 și începutul anilor 1970. În anii 1970, limbajul de programare C a început să devină incredibil de popular. Multe universități și organizații au început să creeze propriile versiuni ale limbii, mai potrivite pentru propriile nevoi. De la începutul anilor 1980, problemele de compatibilitate între diferitele implementări ale limbajului C au devenit prea evidente. În 1983 , Institutul Național American de Standarde (ANSI) a format un comitet pentru a adopta un standard pentru limbajul C, cunoscut sub numele de „ANSI C”. Această lucrare a dus la crearea așa - numitului standard C89 în 1989 . O parte a standardului rezultat a fost un set de biblioteci numit ANSI C Standard Library .
Versiunile ulterioare ale standardului limbajului C au adăugat câteva fișiere de antet noi și mai utile în bibliotecă. Suportul pentru aceste noi extensii a fost dependent de implementare.
Fișierele antet <iso646.h> , <wchar.h> și <wctype.h> au fost adăugate în Anexa 1 (abreviat ca NA1 ), un addendum la Standardul C ratificat în 1995 .
Fișierele de antet <complex.h> , <fenv.h> , <inttypes.h> , <stdbool.h > , <stdint.h> și <tgmath.h> au fost adăugate în C99 , o versiune a standardului C publicat în 1999 .
Biblioteca standard ANSI C constă din 24 de fișiere antet, fiecare dintre acestea putând fi inclus într-un proiect software cu o singură directivă. Fiecare fișier antet conține una sau mai multe declarații de funcție, definiții ale tipurilor de date și macrocomenzi. Conținutul acestor fișiere antet este listat mai jos.
În comparație cu alte limbi (cum ar fi Java ), biblioteca standard este extrem de mică. Biblioteca oferă suport pentru setul de bază de funcții matematice, procesare șiruri, conversie de tip, fișiere și I/O consolă. Nu conține un set standard de „tipuri de containere”, cum ar fi biblioteca de șabloane standard C++ , componente pentru lucrul cu o interfață grafică cu utilizatorul (GUI), rețele și alte funcționalități diverse pe care Java le acceptă standard. Principalul avantaj al bibliotecii standard mici este că facilitează lucrul cu mediul ANSI C decât alte limbi și, prin urmare, mai ușor de portat programele C pe platforme noi.
Multe alte biblioteci au fost dezvoltate pentru a suporta funcționalități similare oferite de alte limbi în bibliotecile lor standard. De exemplu, Proiectul de dezvoltare a mediului desktop GNOME a dezvoltat setul de instrumente grafice GTK+ și GLib , o bibliotecă de structuri de date container, precum și multe alte exemple binecunoscute. Varietatea bibliotecilor disponibile înseamnă că unele instrumente de nivel superior s-au dovedit utile de-a lungul timpului. Un dezavantaj semnificativ este că adesea nu interacționează bine între ele, astfel încât programatorii sunt adesea mai obișnuiți să lucreze cu diferite seturi de biblioteci, iar seturile lor pot fi disponibile pe diferite platforme specifice.
< assert.h > | Conține macrocomanda de aserție , care este utilizată pentru a detecta erori logice și alte tipuri de erori în versiunea programului depanat. |
< complex.h > | Un set de funcții pentru lucrul cu numere complexe . (Introdus în C99 ) |
< ctype.h > | Conține funcții folosite pentru a clasifica caracterele în funcție de tipurile lor, sau pentru a converti între litere mari și mici, indiferent de codificarea folosită (de obicei ASCII sau una dintre extensiile acesteia, deși există implementări care folosesc EBCDIC ). |
< errno.h > | Pentru a verifica codurile de eroare returnate de funcțiile bibliotecii. |
< fenv.h > | Pentru a controla un mediu care utilizează numere în virgulă mobilă . (Introdus în C99 ) |
< float.h > | Conține constante predefinite care descriu specificul implementării proprietăților bibliotecii pentru lucrul cu numere în virgulă mobilă , cum ar fi diferența minimă dintre două numere în virgulă mobilă diferite (_EPSILON), numărul maxim de cifre de precizie (_DIG) și intervalul de numere valide ( _MIN, _MAX ). |
< inttypes.h > | Pentru conversia exactă a tipurilor întregi. (Introdus în C99 ) |
< iso646.h > | Pentru programare în codificare ISO 646 . (Apărut în NA1 ) |
< limite.h > | Conține constante predefinite care definesc specificul implementării proprietăților tipurilor întregi, cum ar fi intervalul de valori valide (_MIN, _MAX). |
< locale.h > | Pentru setlocale() și constantele aferente. Folosit pentru a selecta limba corespunzătoare . |
< matematică.h > | Pentru a calcula funcții matematice de bază |
< setjmp.h > | Declara macrocomenzi setjmpși longjmpeste folosit pentru salturi non-locale |
< semnal.h > | Pentru a controla procesarea semnalului |
< stdarg.h > | Pentru a accesa un număr diferit de argumente transmise funcțiilor. |
< stdbool.h > | Pentru tipurile de date booleene. (Introdus în C99 ) |
< stdint.h > | Pentru a defini diferite tipuri de numere întregi. (Introdus în C99 ) |
< stddef.h > | Pentru a defini mai multe tipuri standard și macrocomenzi. |
< stdio.h > | Implementează capabilitățile de bază de intrare și ieșire în limbajul C. Acest fișier conține o funcție foarte importantă printf. |
< stdlib.h > | Pentru a efectua o varietate de operațiuni, inclusiv conversia, generarea numerelor pseudoaleatoare , alocarea memoriei, controlul procesului, controlul mediului, semnale, căutare și sortare. |
< șir.h > | Pentru a lucra cu diferite tipuri de șiruri. |
< tgmath.h > | Pentru funcții matematice tipice. (Introdus în C99 ) |
< fire.h > | Fișierul antet <threads.h> împreună cu <stdatomic.h> oferă suport pentru programarea paralelă. (Introdus în C11 ) |
< timp.h > | Pentru a converti între diferite formate de oră și dată. |
< wchar.h > | Pentru a gestiona fluxuri „large” și mai multe tipuri de șiruri folosind caractere „large” (suport pentru setul de limbi). (Apărut în NA1 ) |
< wctype.h > | Pentru a clasifica caracterele „large”. (Apărut în NA1 ) |
Unele limbi oferă funcționalitatea bibliotecii standard C cu propriile biblioteci. Biblioteca poate fi adaptată la structurile limbajului, dar semantica operațiilor rămâne similară. Limbajul de programare C++ , de exemplu, conține funcționalitatea bibliotecii standard ANSI C în spațiul de nume standard ( de ex. , etc. ), în fișiere antet cu nume C similare (" "", " " ", " " etc.) . .). Alte limbi care adoptă abordări similare includ, de exemplu, D și Python . În cel din urmă, de exemplu, fișierul obiect încorporat este definit ca „implementat de pachetul C stdio” [1] , astfel încât operațiunile disponibile (deschidere, citire, scriere etc.) sunt de așteptat să se comporte ca și C corespunzătoare. funcțiile limbajului. std::printfstd::atoistd::feofcstdiocmathcstdlib
Nu sunt încă standardizate, dar programele C pot depinde de biblioteci de subrutine care conțin cod folosit de compilator în timpul execuției. Codul care inițializează procesul pentru sistemul de operare, de exemplu, înainte de a apela main(), este implementat în biblioteca C Run-Time (CRT) pentru această versiune a compilatorului. Codul bibliotecii CRT poate ajuta la implementarea altor caracteristici ale limbajului, cum ar fi gestionarea excepțiilor neprinse sau implementarea numerelor în virgulă mobilă.
Biblioteca C Standard reglementează doar prezența subrutinelor de mai sus și comportamentul acestora. Deoarece implementarea compilatorului poate depinde de prezența acestor funcții suplimentare, totul depinde de rutinele compilate în Biblioteca C Standard, așa că orice program dezvoltat cu acestea va avea nevoie de ele.
Deși sunt adesea confundate cu Biblioteca standard C din cauza grupării lor, biblioteca CRT nu este o parte standardizată a limbajului și depinde de modul în care este livrat software-ul.
Unele compilatoare (de ex . GCC [1] ) acceptă versiuni interne ale multor funcții din Biblioteca C Standard; adică implementările funcției sunt scrise în modulul obiect compilat , iar programul apelează versiunile interne în loc de funcțiile bibliotecii C partajate. Acest lucru reduce supraîncărcarea apelului de funcție, mai ales dacă apelul de funcție este înlocuit cu variante încorporate și sunt permise alte forme de optimizare (dacă compilatorul acceptă controlul caracteristicilor variantelor interne), dar poate duce la probleme de depanare (de exemplu, versiuni interne). nu poate fi înlocuit cu versiuni de scule ).pentru verificare).
POSIX (și SUS ) definesc un număr de subrutine care pot fi disponibile în afara celor definite în biblioteca standard C; ele implementează adesea funcționalități similare bibliotecii standard, cu diferite grade de similitudine. De exemplu, glibc implementează funcții precum fork în libc.so, dar bibliotecile de streaming sunt îmbinate în glibc înainte de a fi apelate, chiar dacă este anunțată ca o bibliotecă separată cu propriul steag de linker. Adesea, o astfel de funcționalitate compatibilă cu POSIX este considerată parte a bibliotecii; biblioteca C corespunzătoare poate fi astfel identificată ca bibliotecă C ANSI sau ISO .
Există multe implementări care vin cu diferite sisteme de operare și compilatoare C. Pe sistemele BSD , de exemplu, biblioteca de sistem este încorporată în sistemul de operare și întreținută de un depozit sursă partajat. Pe majoritatea sistemelor, biblioteca poate fi găsită sub numele " libc".
Deși există multe implementări, iată o mică listă a celor mai populare biblioteci:
limbaj de programare C | |
---|---|
Compilatoare |
|
Biblioteci | |
Particularități | |
Unii descendenți | |
C și alte limbi |
|
Categorie: limbaj de programare C |