C стандартты кітапхана - C standard library

The C стандартты кітапхана немесе libc болып табылады стандартты кітапхана үшін C бағдарламалау тілі, көрсетілгендей ANSI C стандартты.[1] Ол бір уақытта дамыды C кітапханасының POSIX сипаттамасы, бұл оның суперсеті.[2][3] ANSI C қабылданғандықтан Халықаралық стандарттау ұйымы,[4] C стандартты кітапханасы деп те аталады ISO C кітапханасы.

С стандартты кітапханасы ұсынады макростар, түрі сияқты міндеттерге арналған анықтамалар мен функциялар жіп өңдеу, математикалық есептеулер, енгізу / шығаруды өңдеу, жадыны басқару, және тағы басқалары операциялық жүйе қызметтер.

Бағдарламалау интерфейсі

Файлдар тақырыбы

The қолданбалы бағдарламалау интерфейсі С стандартты кітапханасының (API) саны жарияланған тақырыптық файлдар. Әрбір тақырып файлында бір немесе бірнеше функциялар туралы мәлімдемелер, мәліметтер типінің анықтамалары және макростар бар.

Ұзақ тұрақтылықтан кейін үш жаңа тақырыптық файл (iso646.h, wchar.h, және wctype.h) бірге қосылды 1-қосымша (NA1), 1995 жылы ратификацияланған С стандартына қосымша. Тағы алты тақырыптық файл (кешенді. сағ, фенв.х, inttypes.h, stdbool.h, stdint.h, және tgmath.h) бірге қосылды C99, 1999 жылы жарияланған С стандартына түзету және тағы бес файл (stdalign.h, stdatomic.h, stdnoreturn.h, жіптер. h, және uchar.h) бірге C11 2011 жылы. Барлығы қазір 29 тақырыптық файл бар:

Аты-жөніҚайданСипаттама
<assert.h>Құрамында бекіту макро, логикалық қателіктер мен бағдарламаның күйін келтірудегі қателіктердің басқа түрлерін анықтауға көмектесу үшін қолданылады.
<complex.h>C99A функциялар жиынтығы айла-шарғы жасау үшін күрделі сандар.
<ctype.h>Анықтайды функциялар жиынтығы таңбаларды типтері бойынша жіктеу үшін немесе бас әріп пен кіші әріптерді қолданудан тәуелсіз тәсілмен түрлендіру үшін қолданылады таңбалар жиынтығы (әдетте ASCII немесе оның кеңейтулерінің бірі, дегенмен іске асыруды қолданады EBCDIC белгілі).
<errno.h>Кітапхана функциялары туралы хабарланған қателік кодтарын тексеру үшін.
<fenv.h>C99A анықтайды функциялар жиынтығы бақылау үшін өзгермелі нүкте қоршаған орта.
<float.h>Анықтайды макро тұрақты сипаттамаларын іске асыруға арналған өзгермелі нүкте кітапхана.
<inttypes.h>C99Анықтайды дәл ені бүтін типтер.
<iso646.h>NA1Анықтайды бірнеше макростар бірнеше стандартты белгілерді білдірудің баламалы тәсілдерін жүзеге асыратын. Бағдарламалау үшін ISO 646 таңбалар жиынтығы.
<limits.h>Анықтайды макро тұрақты бүтін типтердің іске асыруға арналған қасиеттерін көрсету.
<locale.h>Анықтайды оқшаулау функциялары.
<math.h>Анықтайды жалпы математикалық функциялар.
<setjmp.h>Макростар туралы мәлімдейді setjmp және longjmp, олар жергілікті емес шығу үшін қолданылады.
<signal.h>Анықтайды сигналдарды өңдеу функциялары.
<stdalign.h>C11Сұрау және нақтылау үшін туралау объектілер.
<stdarg.h>Функцияларға берілген әр түрлі аргументтерге қол жеткізу үшін.
<stdatomic.h>C11Үшін атомдық операциялар ағындар арасында ортақ пайдаланылатын деректер туралы.
<stdbool.h>C99Анықтайды логикалық мәліметтер типі.
<stddef.h>Анықтайды бірнеше пайдалы типтер мен макростар.
<stdint.h>C99Анықтайды дәл ені типтері.
<stdio.h>Анықтайды негізгі енгізу және шығару функциялары
<stdlib.h>Анықтайды сандық түрлендіру функциялары, жалған кездейсоқ сандарды құру функциялары, жадыны бөлу, процесті басқару функциялары
<stdnoreturn.h>C11Қайтарылмайтын функцияларды көрсету үшін
<string.h>Анықтайды жолдарды өңдеу функциялары
<tgmath.h>C99Анықтайды типтік-математикалық функциялар.
<threads.h>C11Бірнеше басқарудың функцияларын анықтайды жіптер, мутекс және шарттың айнымалылары
<time.h>Анықтайды күн мен уақытты өңдеу функциялары
<uchar.h>C11Манипуляцияның түрлері мен функциялары Юникод кейіпкерлер
<wchar.h>NA1Анықтайды кең жолды өңдеу функциялары
<wctype.h>NA1Анықтайды функциялар жиынтығы кең таңбаларды түрлері бойынша жіктеу үшін немесе үлкен және кіші әріптер арасында түрлендіру үшін қолданылады

Үш файл тақырыбы (кешенді. сағ, stdatomic.h, және жіптер. h) іске асыруды қолдау қажет емес шартты ерекшеліктер.

The POSIX стандарт Unix-ке арналған бірнеше стандартты емес тақырыпшаларды қосты. Көбісі басқа архитектураларға жол тапты. Мысалдарға мыналар жатады жоқ және сигнал.h. Бірқатар басқа топтар басқа стандартты емес тақырыптарды қолданады - the GNU C кітапханасы бар alloca.hжәне HP OpenVMS бар va_count () функциясы.

Құжаттама

Unix тәрізді жүйелерде іс жүзінде енгізілген API-дің беделді құжаттамасы келесі түрінде беріледі адам беттері. Көптеген жүйелерде кітапхананың стандартты функцияларындағы адам парақтары 3 бөлімде орналасқан; 7 бөлімде негізгі тұжырымдамалар туралы жалпы беттер болуы мүмкін (мысалы, man 7 math_error жылы Linux ).

Іске асыру

Unix тәрізді жүйелерде әдетте C кітапханасы болады ортақ кітапхана формада болады, бірақ тақырыптық файлдар (және компилятордың құралдары) қондырғыда болмауы мүмкін, сондықтан C әзірлеу мүмкін болмауы мүмкін. С кітапханасы Unix тәрізді жүйелердегі операциялық жүйенің бөлігі болып саналады. С функциялары, оның ішінде ISO C стандарттары, бағдарламаларда кеңінен қолданылады және олар тек C тіліндегі нәрсені ғана емес, сонымен қатар амалдық жүйе интерфейсінің іс жүзіндегі бөлігі ретінде қарастырылады. Unix тәрізді операциялық жүйелер, егер C кітапханасы өшірілсе, жұмыс істей алмайды. Бұл статикалық байланысқаннан гөрі динамикалық түрде болатын қосымшаларға қатысты. Әрі қарай ядро ​​өзі (кем дегенде Linux жағдайында) кез-келген кітапханаларға тәуелсіз жұмыс істейді.

Microsoft Windows жүйесінде негізгі динамикалық кітапханалар (DLL ) үшін C стандартты кітапханасының орындалуын қамтамасыз ету Microsoft Visual C ++ компилятор v6.0; Microsoft Visual C ++ компиляторының жаңа нұсқаларына арналған C стандартты кітапханасын әр компилятор жеке-жеке ұсынады, сонымен қатар қайта бөлінеді пакеттер. С тілінде жазылған компиляцияланған қосымшалар статикалық түрде C кітапханасымен байланысқан немесе мақсатты жүйелерде болуға емес, осы қосымшалармен бірге жеткізілетін кітапхананың динамикалық нұсқасына байланысты. Компилятордың С кітапханасындағы функциялар Microsoft Windows интерфейсі ретінде қарастырылмайды.

Әр түрлі операциялық жүйелермен де, С компиляторларымен де қамтамасыз етілген көптеген басқа енгізулер бар. Танымал бағдарламалардың кейбіреулері:

Компилятордың кіріктірілген функциялары

Кейбір компиляторлар (мысалы, GCC[7]) C стандартты кітапханасындағы көптеген функциялардың кіріктірілген нұсқаларын ұсыну; яғни функциялардың орындалуы компиляцияға жазылады нысан файлы, және бағдарлама С кітапханасындағы функциялардың орнына кіріктірілген нұсқаларын шақырады ортақ нысан файл. Бұл функционалды-қоңырау үстеме ақысын азайтады, әсіресе функционалдық қоңыраулар ауыстырылған жағдайда кезекте нұсқалары, және басқа формаларына мүмкіндік береді оңтайландыру (қалай құрастырушы біледі басқару ағыны орнатылған нұсқалардың сипаттамалары), бірақ түзету кезінде шатасулар тудыруы мүмкін (мысалы, кіріктірілген нұсқалармен ауыстырыла алмайды) аспапты нұсқалары).

Алайда, кіріктірілген функциялар ISO C стандартына сәйкес қарапайым функциялар сияқты жұмыс істеуі керек. Басты қорытынды: бағдарлама осы функцияларға олардың адрестерін ала отырып, сілтеме құра алады және сол көрсеткіштің көмегімен функцияны орындай алады. Егер бір функцияға екі көрсеткіш бағдарламадағы екі түрлі аударма бірлігінде алынған болса, онда бұл екі көрсеткіш тең ​​мәнді салыстыруы керек; яғни адрес сыртқы (жалпы бағдарламалық) байланысы бар функцияның атауын шешу арқылы келеді.

Байланыстыру, libm

FreeBSD астында[8] және Linux[дәйексөз қажет ], математикалық функциялар математика) математикалық кітапханада бөлек жинақталған libm. Егер олардың кез-келгені қолданылса, сілтемеге директива берілуі керек -lm.

Анықтау

С стандарты бойынша макро __STDC_HOSTED__ үшін анықталуы керек 1 егер іске асыру орналастырылған болса. Орналастырылған бағдарлама C стандартында көрсетілген барлық тақырыптарға ие. Іске асыру болуы мүмкін жеке бұл дегеніміз, бұл тақырыптар болмайды. Егер іске асыру болса жеке, ол анықталуы керек __STDC_HOSTED__ дейін 0.

Тұжырымдамалар, проблемалар және уақытша шешімдер

Буфердің толып жатқан осалдығы

С стандартты кітапханасындағы кейбір функциялар белгілі болды буферден асып кету олар қабылданған кезден бастап осалдығы және жалпы көтермелейтін бағдарламалық жасақтама.[a] Ең көп сынға ұшыраған заттар:

  • жолдарды манипуляциялау рәсімдері, оның ішінде strcpy () және strcat (), шекараны тексермегендіктен және егер қолмен тексерілмеген болса, буфердің асып кетуінен;
  • тұтастай алғанда тізбектегі күнделікті әрекеттер жанама әсерлер, әрдайым жарамды екеніне кепілдік бере бермей, буферді жауапсыз пайдалануға шақырады күші жойылған шығыс, сызықтық ұзындықты есептеу;[b]
  • printf () бұзу үшін күнделікті жұмыстардың отбасы орындау стегі формат жолдары келтірілген аргументтерге сәйкес келмегенде. Бұл негізгі кемшілік шабуылдардың бүкіл класын тудырды: жол шабуылдарын форматтау;
  • алады () және сканф () енгізу ұзындығын тексерудің болмауына байланысты (кез-келген немесе оңай) енгізу-шығару амалдарының отбасы.

Шектен тыс жағдайды қоспағанда алады (), жадыны басқаруды, шекараларды тексеруді, кірісті тексеруді және т.б. орындау үшін қосалқы кодты енгізу арқылы қауіпсіздіктің барлық осалдықтарын болдырмауға болады. Бұл көбінесе стандартты кітапхана функцияларын қауіпсіз және пайдалануды жеңілдететін қаптамалар түрінде жасалады. Бұл ерте кезден басталады Бағдарламалау практикасы Б.Керниганның және Р.Пиктің кітабы, онда авторлар көбінесе қате туралы хабарламаларды басып шығаратын және қате пайда болса, бағдарламадан шығатын орамаларды пайдаланады.

ISO C комитеті TR 24731-1 техникалық есептерін жариялады[9] және TR 24731-2-де жұмыс істейді[10] сәйкесінше шектеулерді тексеретін және буферді автоматты түрде бөлетін кейбір функцияларды қабылдауды ұсыну. Бұрынғы кейбіреулер мақтаумен ауыр сынға ұшырады,[11][12] соңғысы әртүрлі жауаптар алды. Осыған қарамастан, TR 24731-1 Microsoft корпорациясының C стандартты кітапханасына енгізілген және оның компиляторы ескі «қауіпті» функцияларды қолдану кезінде ескерту жасайды.

Жіптің проблемалары, жарыс жағдайларына осалдығы

The қателік () күнделікті болу сынға алынады жіп қауіпті және басқаша түрде осал жарыс шарттары.

Өңдеу қателігі

С стандартты кітапханасындағы функциялардың қателіктері бірізді емес және кейде шатастырады. Linux нұсқаулық бетіне сәйкес math_error, «Glibc-тегі қазіргі (2.8 нұсқасы) ахуал нашар. Функциялардың көпшілігі (бірақ бәрі емес) қателіктерге қатысты ерекшеліктер тудырады. Кейбіреулері қате. Бірнеше функция орнатылды қате, бірақ ерекше жағдай жасамаңыз. Өте аз функциялар мұны да істемейді. «[13]

Стандарттау

Түпнұсқа C тілі сияқты дәстүрлі тілдерге қарағанда енгізу-шығару операциялары сияқты кіріктірілген функцияларды қамтамасыз етпеді COBOL және Фортран.[дәйексөз қажет ] Уақыт өте келе, C қолданушылар қауымдастығы C стандартты кітапханалары деп аталатын идеялар мен іске асырулармен бөлісті. Осы идеялардың көпшілігі ақыр соңында стандартталған С тілінің анықтамасына енгізілді.

Екеуі де Unix және C құрылды AT & T's Bell Laboratories 1960 жылдардың аяғы мен 1970 жылдардың басында. 1970 жылдардың ішінде С тілі барған сайын танымал бола бастады. Көптеген университеттер мен ұйымдар өздерінің жобалары үшін тілдің өзіндік нұсқаларын жасай бастады. 1980 жылдардың басында әр түрлі С енгізудің арасындағы үйлесімділік проблемалары айқын болды. 1983 жылы Американдық ұлттық стандарттар институты (ANSI) «деп аталатын C стандартты спецификациясын құру жөніндегі комитет құрдыANSI C «. Бұл жұмыс 1989 жылы C89 деп аталатын стандартты құрумен аяқталды. Нәтижесінде алынған стандарттың бір бөлігі бағдарламалық кітапханалар ANSI C стандартты кітапханасы деп аталады.

POSIX стандартты кітапханасы

POSIX, Сонымен қатар SUS, негізгі C стандартты кітапханасында болуы мүмкін бірнеше процедураларды көрсетіңіз. POSIX спецификациясы басқа мақсаттармен қатар тақырыптық файлдарды, көп бұрандалы, желілік, және тұрақты тіркестер. Олар көбінесе әртүрлі стандартты кітапханалармен бірге орындалады, әр түрлі дәрежеде жақын. Мысалға, glibc сияқты функцияларды жүзеге асырады шанышқы ішінде libc.so, бірақ бұрын NPTL glibc-ге біріктіріліп, жеке сілтеме жалаушасы бар жеке кітапхана болды. Көбіне бұл POSIX функциясы кітапхананың бір бөлігі ретінде қарастырылады; негізгі C кітапханасы ANSI немесе ретінде анықталуы мүмкін ISO C кітапханасы.

BSD libc

BSD libc құрамына кіретін С кітапханалары қолдайтын POSIX стандартты кітапханасының супер жиынтығы BSD операциялық жүйелер сияқты FreeBSD, NetBSD, OpenBSD және macOS. BSD libc-де бастапқы стандартта анықталмаған кейбір кеңейтімдер бар, олардың көпшілігі алғаш 1994 жылы пайда болды 4.4BSD босату (бірінші стандарт 1989 жылдан бастап шығарылғаннан кейін негізінен дамыған). BSD libc кеңейтімдерінің кейбіреулері:

  • sys / tree.h - орындалуын қамтиды Қызыл-қара ағаш және Ағаш[14][15]
  • sys / кезек.h - іске асыру Байланыстырылған тізім, кезектер, құйрық кезегі және т.б.[16][17]
  • fgetln () - анықталған stdio.h. Мұны файл жолын жолға оқуға қолдануға болады.[18][19][20]
  • fts.h - файл иерархиясын өтуге арналған кейбір функцияларды қамтиды[21][22]
  • db.h - қосылу үшін кейбір функциялар Беркли Д.Б.[23][24]
  • strlcat () және strlcpy () - үшін қауіпсіз баламалар strncat () және strncpy ()[25][26][27][28][29]
  • қате - форматталған қате туралы хабарламаларды басып шығаруға арналған кейбір функцияларды қамтиды[30][31]
  • көрініс - құрамында vis () функциясы. Бұл функция басылмайтын таңбаларды визуалды форматта көрсету үшін қолданылады.[32][33][34]

Басқа тілдердегі С стандартты кітапханасы

Кейбір тілдер стандартты С кітапханасының функционалдығын өздерінің кітапханаларына қосады. Кітапхана тіл құрылымына сәйкес келуі үшін бейімделген болуы мүмкін, бірақ жедел семантика ұқсас сақталады. The C ++ мысалы, тілге C стандартты кітапханасының функционалдығы кіреді аттар кеңістігі std (мысалы, std :: printf, std :: atoi, std :: feof), C-ге ұқсас атаулары бар тақырыптық файлдарда (cstdio, cmath, cstdlibжәне т.б.). Осындай тәсілдерді қолданатын басқа тілдер де бар Д., Перл, Рубин және негізгі іске асыру Python ретінде белгілі CPython. Мысалы, Python 2-де кірістірілген файл нысандары «C-ді қолдану арқылы жүзеге асырылады stdio пакет «,[35] қол жетімді операциялар (ашық, оқу, жазу және т.б.) сәйкес C функциялары сияқты мінез-құлыққа ие болады деп күтілуде. Тот деп аталатын жәшігі бар libc бұл бірнеше С функцияларын, құрылымдарын және басқа анықтамаларды пайдалануға мүмкіндік береді.[36]

Басқа тілдердің стандартты кітапханаларымен салыстыру

С стандартты кітапханасы кейбір басқа тілдердің стандартты кітапханаларымен салыстырғанда аз. С кітапханасы математикалық функциялардың негізгі жиынтығын, жолдармен манипуляцияны, типтік түрлендірулерді және файл мен консольға негізделген енгізу-шығаруды ұсынады. Оған стандартты «жиынтығы кірмейдіконтейнер түрлері «сияқты C ++ Стандартты шаблон кітапханасы, толық емес графикалық интерфейс (GUI) инструменттер жинағы, желілік құралдар және басқа функционалдық мүмкіндіктер Java және .NET Framework стандартты түрде қамтамасыз етіңіз. Шағын стандартты кітапхананың басты артықшылығы - ISO C ортасын ұсыну басқа тілдерге қарағанда әлдеқайда жеңіл, демек С-ны жаңа платформаға көшіру салыстырмалы түрде оңай.

Сондай-ақ қараңыз

Ескертулер

  1. ^ Моррис құрты белгілі осалдығын пайдаланады алады () 1988 жылы құрылды.
  2. ^ С стандартты кітапханасында жол ұзындығын есептеу және жолдың соңын іздеу уақыттың сызықтық күрделілігі және сол немесе байланысты жолдарда бірнеше рет қолданған кезде тиімсіз

Әдебиеттер тізімі

  1. ^ ISO /IEC (1999). ISO / IEC 9899: 1999 (E): бағдарламалау тілдері - C §7.19.1 1-параграф
  2. ^ «GNU C кітапханасы - кіріспе». gnu.org. Алынған 2013-12-05.
  3. ^ «C стандартты кітапханасы мен C POSIX кітапханасы арасындағы айырмашылық». stackoverflow.com. 2012. Алынған 2015-03-04.
  4. ^ «C стандарттары». Кил. Алынған 24 қараша 2011.
  5. ^ «Re: Newlib ммму-аз процессорларды қолдай ма?». Cygwin.com. 23 наурыз 2006. мұрағатталған түпнұсқа 2008 жылғы 22 қарашада. Алынған 28 қазан 2011.
  6. ^ «musl libc». Etalabs.net. Алынған 28 қазан 2011.
  7. ^ GCC ұсынатын басқа кіріктірілген функциялар, GCC нұсқаулығы
  8. ^ «Компьютермен құрастыру». Алынған 2013-03-02.
  9. ^ «ISO / IEC TR 24731-1: С кітапханасының кеңейтімдері, I бөлім: шекараларды тексеру интерфейстері» (PDF). open-std.org. 2007-03-28. Алынған 2014-03-13.
  10. ^ «ISO / IEC WDTR 24731-2: C кітапханасына арналған кеңейтімдер, II бөлім: динамикалық бөлу функциялары» (PDF). open-std.org. 2008-08-10. Алынған 2014-03-13.
  11. ^ С кодында TR 24731 «қауіпсіз» функцияларын қолданасыз ба? - Стек толуы
  12. ^ «ISO / IEC WDTR 24731 Остин тобына шолу». Алынған 28 қазан 2011.
  13. ^ «math_error - математикалық функциялардан қателерді анықтау». man7.org. 2008-08-11. Алынған 2014-03-13.
  14. ^ «ағаш». Man.freebsd.org. 2007-12-27. Алынған 2013-08-25.
  15. ^ «Супер пайдаланушының BSD сілтемесі: /OpenBSD/sys/sys/tree.h». bxr.su.
  16. ^ «кезек». Man.freebsd.org. 2011-05-13. Алынған 2013-08-25.
  17. ^ «Super User's BSD Cross Reference: /OpenBSD/sys/sys/queue.h». bxr.su.
  18. ^ «fgetln». Man.freebsd.org. 1994-04-19. Алынған 2013-08-25.
  19. ^ «Супер пайдаланушының BSD айқас сілтемесі: /OpenBSD/lib/libc/stdio/fgetln.c». bxr.su.
  20. ^ «Супер пайдаланушының BSD айқындамасы: /OpenBSD/include/stdio.h». bxr.su.
  21. ^ «fts». Man.freebsd.org. 2012-03-18. Алынған 2013-08-25.
  22. ^ «Super User's BSD Cross Reference: /OpenBSD/include/fts.h». bxr.su.
  23. ^ «db». Man.freebsd.org. 2010-09-10. Алынған 2013-08-25.
  24. ^ «Супер пайдаланушының BSD айқындамасы: /OpenBSD/include/db.h». bxr.su.
  25. ^ Миллер, Тодд С. және Тео де Раадт. strlcpy және strlcat - дәйекті, қауіпсіз, жолды көшіру және біріктіру. 1999 жылғы USENIX жылдық техникалық конференциясының материалдары, 6-11 маусым, 1999, 175–178 бб.
  26. ^ «Супер пайдаланушының BSD айқындамасы: /OpenBSD/lib/libc/string/strlcat.c». bxr.su.
  27. ^ «Супер пайдаланушының BSD айқас сілтемесі: /OpenBSD/lib/libc/string/strlcpy.c». bxr.su.
  28. ^ «Супер пайдаланушының BSD айқас сілтемесі: /OpenBSD/lib/libc/string/strncat.c». bxr.su.
  29. ^ «Супер пайдаланушының BSD айқындамасы: /OpenBSD/lib/libc/string/strncpy.c». bxr.su.
  30. ^ «қате». Man.freebsd.org. 2012-03-29. Алынған 2013-08-25.
  31. ^ «Супер пайдаланушының BSD айқас сілтемесі: /OpenBSD/include/err.h». bxr.su.
  32. ^ «vis (3)». Man.FreeBSD.org. Алынған 14 қыркүйек 2013.
  33. ^ «Супер пайдаланушының BSD айқындамасы: /OpenBSD/lib/libc/gen/vis.c». bxr.su.
  34. ^ «Супер пайдаланушының BSD айқас сілтемесі: /OpenBSD/include/vis.h». bxr.su.
  35. ^ «Python стандартты кітапханасы: 6.9. Файл нысандары». Docs.python.org. Алынған 28 қазан 2011.
  36. ^ «libc». Тот жәшіктері. Архивтелген түпнұсқа 2016 жылғы 18 тамызда. Алынған 31 шілде 2016.

Әрі қарай оқу

Сыртқы сілтемелер