C Standardbibliotek

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 17. juni 2021; checks kræver 6 redigeringer .

C-standardbiblioteket (også kendt som libc , crt ) er den del af ANSI C- standarden , der er dedikeret til header-filer og biblioteksrutiner . Er en beskrivelse af implementeringen af ​​almindelige operationer såsom I/O og strengbehandling i programmeringssproget C. C Standard Library er en beskrivelse af en programmeringsgrænseflade , ikke et ægte bibliotek, der kan bruges i kompileringsprocessen .

Struktur

Navnet og karakteristika for hver funktion er specificeret i en fil kaldet en header-fil , men den aktuelle implementering af funktionerne er beskrevet separat i en biblioteksfil . Navnene og mulighederne for header-filer bliver almindelige, men organiseringen af ​​biblioteker er stadig heterogen. Standardbiblioteket kommer normalt med compileren . Fordi C-kompilere ofte giver udvidet funktionalitet, der ikke er defineret af ANSI C -standarden, er en compilers standardbibliotek inkompatibelt med standardbibliotekerne for andre compilere.

Udtalelser om struktur

Meget af C-standardbiblioteket ser ud til at være godt designet. Nogle af de enkelte dele, der tidligere har været fordelagtige, kan være udsat for fejl. Strenginputfunktionerne gets()(og brugen scanf()til at læse inputstrenge) er kilden til mange bufferoverløb , så de fleste programmeringsvejledninger råder dig til at undgå disse tricks. Funktionen strcpy()er også ret berygtet. En anden tvetydig funktion er strtok() - en funktion designet som en simpel leksikalsk analysator , men med mange "faldgruber" og derfor meget vanskelig at bruge.

Valget om at bruge typen size_ti stedet for intfor antallet af elementer, der er specificeret for fread()og fwrite()er inkonsistent med den generelle semantik udviklet til for size_t(for at repræsentere antallet af bytes).

stdioer ret begrænset (for højt niveau til at blive brugt i mange situationer), og standarden tillader ikke brugeren selv at tildele eller udvide dens egenskaber. Som et resultat udvikler mange applikationer deres egne wrapper-biblioteker omkring mekanismer og funktioner på lavere niveau implementeret af OS, såsom POSIX . For eksempel stdiofungerer de ikke med signaler eller asynkrone non-burst I/O-tilstande, der er meget brugt i netværksservere. Som et resultat kan funktioner stdiokun stoles fuldt ud på af servere, der bruger hele procesmodellen, så klienten kan betjene dem på POSIX -kompatible systemer i batch I/O.

Visse funktioner i standardbiblioteket bør undgås, når der udvikles flertrådede applikationer. Trådstyringsprimitiverne var beregnet til resten af ​​operativsystemet og ignorerer almindelige standarder som POSIX-trådbiblioteket, idet de forventer, at C-programmører selv tager sig af det, arbejder med genbrug og synkronisering. Hverken C-sproget eller dets standardbibliotek kontrollerer på nogen måde for sådanne systemspecifikke resultater.

Historie

C - programmeringssproget før standardiseringen gav ikke indbygget funktionalitet såsom I/O-operationer (i modsætning til traditionelle sprog som Cobol og Fortran ). Senere blev ideer født i C-programmeringsfællesskabet, som blev implementeret i det, vi nu kalder C Standard Library for at understøtte denne funktionalitet. De fleste af disse ideer kom til sidst sammen for at definere C-programmeringssprogstandarden.

Både Unix og C blev skabt på AT&T's Bell Laboratories i slutningen af ​​1960'erne og begyndelsen af ​​1970'erne. I 1970'erne begyndte programmeringssproget C at blive utrolig populært. Mange universiteter og organisationer er begyndt at skabe deres egne versioner af sproget, mere egnede til deres egne behov. Siden begyndelsen af ​​1980'erne er kompatibilitetsproblemer mellem forskellige implementeringer af C-sproget blevet alt for tydelige. I 1983 dannede American National Standards Institute (ANSI) en komité for at vedtage en standard for C-sproget, kendt som "ANSI C". Dette arbejde resulterede i skabelsen af ​​den såkaldte C89- standard i 1989 . En del af den resulterende standard var et sæt biblioteker kaldet ANSI C Standard Library .

Efterfølgende versioner af C-sprogstandarden tilføjede nogle nye og mere nyttige header-filer til biblioteket. Support til disse nye udvidelser var implementeringsafhængig.

Overskriftsfilerne <iso646.h> , <wchar.h> og <wctype.h> blev tilføjet i bilag 1 (forkortet NA1 ), et tillæg til C-standarden ratificeret i 1995 .

Header-filerne < complex.h> , <fenv.h> , < inttypes.h> , <stdbool.h > , <stdint.h> og <tgmath.h> blev tilføjet i C99 , en version af C-standarden udgivet i 1999 .

ANSI standard

ANSI C standardbiblioteket består af 24 header-filer, som hver kan inkluderes i et softwareprojekt med et enkelt direktiv. Hver overskriftsfil indeholder en eller flere funktionserklæringer, datatypedefinitioner og makroer. Indholdet af disse header-filer er angivet nedenfor.

Sammenlignet med nogle andre sprog (såsom Java ) er standardbiblioteket ekstremt lille. Biblioteket understøtter det grundlæggende sæt af matematiske funktioner, strengbehandling, typekonvertering, fil- og konsol-I/O. Det indeholder ikke et standardsæt af "containertyper" som C++ standard skabelonbiblioteket , komponenter til at arbejde med en grafisk brugergrænseflade (GUI), netværk og anden diverse funktionalitet, som Java understøtter som standard. Den største fordel ved det lille standardbibliotek er, at det gør det lettere at arbejde med ANSI C-miljøet end andre sprog, og derfor lettere at portere C-programmer til nye platforme.

Mange andre biblioteker er blevet udviklet til at understøtte lignende funktionalitet leveret af andre sprog i deres standardbiblioteker. For eksempel udviklede GNOME Desktop Environment Development Project det grafiske værktøjssæt GTK+ og GLib  , et bibliotek af containerdatastrukturer, samt mange andre velkendte eksempler. De mange tilgængelige biblioteker betyder, at nogle værktøjer på øverste niveau har vist sig nyttige over tid. En væsentlig ulempe er, at de ofte ikke interagerer godt med hinanden, så programmører er ofte mere vant til at arbejde med forskellige sæt af biblioteker, og deres sæt kan være tilgængelige på forskellige specifikke platforme.

ANSI C bibliotekets header-filer med C99 og C11 tilføjelser

< assert.h > Indeholder påstandsmakroen , som bruges til at detektere logiske og nogle andre typer fejl i den version af programmet, der fejlsøges.
< kompleks.h > Et sæt funktioner til at arbejde med komplekse tal . (Introduceret i C99 )
< ctype.h > Indeholder funktioner, der bruges til at klassificere tegn efter deres typer eller til at konvertere mellem store og små bogstaver, uanset hvilken kodning der bruges (normalt ASCII eller en af ​​dens udvidelser, selvom der er implementeringer, der bruger EBCDIC ).
< errno.h > For at kontrollere fejlkoder returneret af biblioteksfunktioner.
< fenv.h > At styre et miljø, der bruger flydende decimaltal . (Introduceret i C99 )
< float.h > Indeholder foruddefinerede konstanter, der beskriver implementeringsspecifikationerne for biblioteksegenskaber til arbejde med flydende decimaltal , såsom minimumsforskellen mellem to forskellige flydende decimaltal (_EPSILON), det maksimale antal præcisionscifre (_DIG) og rækken af ​​gyldige tal ( _MIN, _MAX ).
< inttypes.h > Til nøjagtig konvertering af heltalstyper. (Introduceret i C99 )
< iso646.h > Til programmering i ISO 646- kodning . (Dukkede op i NA1 )
< limits.h > Indeholder foruddefinerede konstanter, der definerer implementeringsspecifikationerne for egenskaber af heltaltyper, såsom rækken af ​​gyldige værdier (_MIN, _MAX).
< locale.h > For setlocale() og relaterede konstanter. Bruges til at vælge det relevante sprog .
< math.h > At beregne grundlæggende matematiske funktioner
< setjmp.h > Erklærer makroer setjmpog longjmpbruges til ikke-lokale hop
< signal.h > Til styring af signalbehandling
< stdarg.h > For at få adgang til et andet antal argumenter, der sendes til funktioner.
< stdbool.h > For booleske datatyper. (Introduceret i C99 )
< stdint.h > At definere forskellige typer heltal. (Introduceret i C99 )
< stddef.h > At definere flere standardtyper og makroer.
< stdio.h > Implementerer grundlæggende input- og outputfunktioner i C-sproget. Denne fil indeholder en meget vigtig funktion printf.
< stdlib.h > At udføre en række operationer, herunder konvertering, generering af pseudo-tilfældige tal , hukommelsesallokering, proceskontrol, miljøkontrol, signaler, søgning og sortering.
< string.h > At arbejde med forskellige slags strenge.
< tgmath.h > Til typiske matematiske funktioner. (Introduceret i C99 )
< threads.h > Header-filen <threads.h> sammen med <stdatomic.h> understøtter parallel programmering. (Introduceret i C11 )
< time.h > At konvertere mellem forskellige tids- og datoformater.
< wchar.h > At håndtere "brede" streams og flere slags strenge ved hjælp af "brede" tegn (understøttelse af sprogsæt). (Dukkede op i NA1 )
< wctype.h > At klassificere "brede" tegn. (Dukkede op i NA1 )

C Standard Library på andre sprog

Nogle sprog giver funktionaliteten af ​​C-standardbiblioteket med deres egne biblioteker. Biblioteket kan tilpasses sprogets strukturer, men semantikken i operationerne forbliver ens. Programmeringssproget C++ indeholder f.eks. funktionaliteten af ​​ANSI C-standardbiblioteket i std-navnerummet ( f.eks. , , etc. ), i header-filer med lignende C-navne (" "", " " ", " " osv.) ...). Andre sprog, der tager lignende tilgange, inkluderer for eksempel D og Python . I sidstnævnte er den indbyggede objektfil for eksempel defineret som "implementeret af C-pakkens stdio" [ 1] , så de tilgængelige operationer (åbn, læs, skriv osv.) forventes at opføre sig som den tilsvarende C sproglige funktioner. std::printfstd::atoistd::feofcstdiocmathcstdlib

Generel bibliotekssupport

Endnu ikke standardiseret, men C-programmer kan afhænge af biblioteker af underrutiner, der indeholder kode, der bruges af compileren under kørsel. Koden, der initialiserer processen for operativsystemet, f.eks. før kald main(), er implementeret i C Run-Time Library (CRT) for denne version af compileren. CRT-bibliotekskoden kan hjælpe med at implementere andre sprogfunktioner, såsom håndtering af ufangede undtagelser eller implementering af flydende kommanumre.

C Standardbiblioteket regulerer kun tilstedeværelsen af ​​ovenstående underrutiner og deres adfærd. Da implementeringen af ​​compileren kan afhænge af tilstedeværelsen af ​​disse ekstra funktioner, afhænger det hele af, hvilke rutiner der er kompileret i C Standard Library, så ethvert program udviklet med dem vil have brug for dem.

Selvom de ofte forveksles med C Standard Library på grund af deres bundling, er CRT-biblioteket ikke en standardiseret del af sproget og afhænger af, hvordan softwaren leveres.

Compiler egenskaber

Nogle compilere (f.eks. GCC [1] ) understøtter interne versioner af mange funktioner i C Standard Library; det vil sige, at funktionsimplementeringerne skrives ind i det kompilerede objektmodul , og programmet kalder de interne versioner i stedet for de delte C-biblioteksfunktioner. Dette reducerer overhead til funktionskald, især hvis funktionskaldet erstattes af indbyggede varianter, og andre former for optimeringer er tilladt (hvis compileren understøtter styring af egenskaberne for interne varianter), men kan føre til fejlfindingsproblemer (f.eks. interne versioner). kan ikke erstattes af værktøjsversioner ).

POSIX Standardbibliotek

POSIX (og SUS ) definerer et antal underrutiner, der kan være tilgængelige ud over dem, der er defineret i C-standardbiblioteket; de implementerer ofte funktionalitet svarende til standardbiblioteket, med varierende grader af lighed. For eksempel implementerer glibc funktioner som fork i libc.so, men streamingbibliotekerne flettes ind i glibc, før de kaldes, selvom det annonceres som et separat bibliotek med sit eget linkerflag. Ofte betragtes en sådan POSIX-kompatibel funktionalitet som en del af biblioteket; det tilsvarende C-bibliotek kan således identificeres som et ANSI- eller ISO C-bibliotek.

Implementeringer

Der er mange implementeringer, der kommer med forskellige operativsystemer og C-kompilere. På BSD -systemer er systembiblioteket for eksempel indbygget i operativsystemet og vedligeholdes af et delt kildelager. På de fleste systemer kan biblioteket findes under navnet " libc".

Selvom der er mange implementeringer, er her en lille liste over de mest populære biblioteker:

Se også

Links

  1. Andre indbyggede funktioner leveret af GCC Arkiveret 11. december 2008 på Wayback Machine , GCC Guide
  2. Re: Understøtter Newlib mmu-løse processorer? (utilgængeligt link) . Hentet 3. oktober 2008. Arkiveret fra originalen 22. november 2008. 
  3. musl - Introduktion . www.musl-libc.org. Hentet 30. januar 2017. Arkiveret fra originalen 12. november 2020.

Yderligere kilder