Кіріспе

C бағдарламалау тілі үшін стандартты кітапхана – C бағдарламалау тілі үшін ISO C стандартында белгіленген стандартты кітапхана, немесе libc. Ол ANSI C стандартымен бірге әзірленді және POSIX кітапханасының спецификациясының негізі болып табылады, ол одан кеңейтілген нұсқа. ANSI C Халықаралық Стандарттау Ұйымы (ISO) қабылдағандықтан, C стандартты кітапханасы ISO C кітапханасы деп те аталады. C стандартты кітапханасы макростарды, типтерді анықтауды және жолдарды өңдеу, математикалық есептеулер, кіріс/шығыс өңдеу, жадты басқару және басқа да операциялық жүйе қызметтері сияқты міндеттер үшін функцияларды қамтамасыз етеді.

Басты файлдар

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

Атауы <assert.h> Сипаттамасы Бағдарламаны жөндеу кезінде логикалық қателер мен басқа да ақауларды анықтауға көмектесетін assert макросын жариялайды. <complex.h> C99 Күрделі сандарды өңдеуге арналған функциялар жиынтығын анықтайды. <ctype.h> Таңбаларды түрлері бойынша жіктеуге немесе пайдаланылған таңбалар жиынтығына тәуелсіз түрде үлкен және кіші әріптер арасында түрлендіруге арналған функциялар жиынтығын анықтайды (әдетте ASCII немесе оның кеңейтімдері, бірақ EBCDIC-ті пайдаланатын іске асырулар да белгілі). <errno.h> Кітапхана функцияларымен хабарланған қате кодтарын тексеруге арналған. <fenv.h> C99 Жылжымалы нүктелі ортаны басқаруға арналған функциялар жиынтығын анықтайды. <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 Кең таңбаларды түрлері бойынша жіктеуге немесе үлкен және кіші әріптер арасында түрлендіруге арналған функциялар жиынтығын анықтайды.

complex.h, stdatomic.h және threads.h бас файлдарының үшеуі іске асырулар қолдау көрсетуге міндетті емес шартты мүмкіндіктер болып табылады. POSIX стандарты Unix-ке тән функционалдық мүмкіндіктер үшін бірнеше стандартты емес C бас файлдарын қосты. Көптеген басқа архитектураларға да көшті. Мысалдарға fcntl.h және unistd.h кіреді. Басқа топтар басқа стандартты емес бас файлдарды пайдаланады – GNU C кітапханасында alloca.h бар, ал OpenVMS-де va_count функциясы бар.

Құжаттамалық

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

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

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

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

FreeBSD және glibc жүйелерінде, sin сияқты кейбір функциялар әдепкі бойынша байланыстырылмайды және математикалық libm кітапханасында жинақталады. Егер олардың кез келгені қолданылса, байланыстырушыға "lm" нұсқауы берілуі керек. POSIX c99 компиляторының lm-ді қолдауын және math.h, complex.h және fenv.h атты бас файлдарда жарияланған функциялардың lm көрсетілген жағдайда байланыстыру үшін қолжетімді болуын талап етеді, бірақ функциялар әдепкі бойынша байланыстырылған-байолмайтынын нақтыламаиды. musl осы талапты барлық нәрсені бір libc кітапханасына біріктіріп, бос libm ұсына отырып қанағаттандырады.

Анықтау

C стандартына сәйкес, егер орындалу ортасы болса, STDC HOSTED макросы 1-ге тең болуы керек. Ортасы бар орындалу C стандартында көрсетілген барлық кітапханаларды қамтиды. Орындалу жеке (freestanding) де болуы мүмкін, яғни бұл кітапханалар болмайды. Егер орындалу жеке болса, онда ол STDC HOSTED макросын 0-ге теңбелеуі керек.

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

Strerror функциясы жіп қауіпсіз емес және жарыс жағдайларына осал деп сынға түседі.

Қателерді өңдеу

C стандартты кітапханасындағы функциялардың қателіктерді өңдеуі біркелкі емес және кейде шатастыратын. Linux нұсқаулығындағы математикалық қателер бетінде айтылғандай, "glibc-тің (2.8 нұсқасы) қазіргі жағдайы жағдайсыз. Көптеген (бірақ барлығы емес) функциялар қателер туғанда ерекшеліктерді көтереді. Кейбіреулері сондай-ақ errno-ны орнатады. Аз ғана функциялар errno-ны орнатады, бірақ ерекшелік тудырмайды. Өте аз функциялар екеуін де жасамайды".

Стандарттау

Бастапқы C тілінде COBOL және Fortran сияқты дәстүрлі тілдерден өзгеше, I/O операциялары сияқты кіріктірілген функциялар болған жоқ. Уақыт өте келе, C тілін қолданушылар қауымдастығы қазіргі C стандартты кітапханалары деп аталатын идеялар мен іске асыруларды бөлісті. Осы идеялардың көптегені ақырында стандартталған C тілінің анықтамасына енгізілді. Unix және C екеуі де 1960 жылдардың соңы мен 1970 жылдардың басында AT&T Bell Laboratories-те жасалды. 1970 жылдары C тілінің танымалдығы арта түсті. Көптеген университеттер мен ұйымдар өздерінің жобалары үшін тілдің өз нұсқаларын жасауға кірісті. 1980 жылдардың басында әртүрлі C іске асырулары арасындағы үйлесімсіздік мәселелері анық байқалды. 1983 жылы Америка Ұлттық Стандарттар Институты (ANSI) "ANSI C" деп аталатын C тілінің стандартты сипаттамасын әзірлеу үшін комиссия құрды. Бұл жұмыс 1989 жылы C89 стандартын жасаумен аяқталды. Дамыған стандарттың бір бөлігі ANSI C стандартты кітапханасы деп аталатын бағдарламалық кітапханалар жиынтығы болды.

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

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

C стандартты кітапханасы басқа тілдерде

Кейбір тілдер өз кітапханаларына стандартты C кітапханасының мүмкіндіктерін қосады. Кітапхана тілдің құрылымына жақсырақ бейімделуі мүмкін, бірақ операциялық семантикасы ұқсас күйде сақталады. Мысалы, C++ тілі C стандартты кітапханасының мүмкіндіктерін std кеңістігінде қамтиды (мысалы, std::printf, std::atoi, std::feof), C кітапханаларына ұқсас атаулары бар зақыптарда (cstdio, cmath, cstdlib және т.б.). D, Perl, Ruby және CPython деп аталатын Python-ның негізгі нұсқасы сияқты басқа тілдер де ұқсас тәсілдерді қолданады. Мысалы, Python 2-де құрылған файлдық объектілер "C-нің stdio жинағын пайдаланып іске асырылған" деп анықталады, сондықтан қолжетімді операциялардың (ашу, оқу, жазу және т.б.) сәйкес C функцияларымен бірдей әрекет етуі күтіледі. Rust-та бірнеше C функцияларын, құрылымдарды және басқа типтік анықтамаларды пайдалануға мүмкіндік беретін "crate" деп аталатын пакет бар.

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

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