**Стандартнай бібліятэкай мовы C** (таксама вядомая як **libc**, **crt**) называецца частка стандарту ANSI C, прысвечаная загалоўкавым файлам і бібліятэчным падпраграмам. З'яўляецца апісаннем рэалізацыі агульных аперацый, такіх як апрацоўка ўводу-вываду і радкоў, у мове праграмавання C. Стандартная бібліятэка мовы C — гэта апісанне праграмнага інтэрфейса, а не сапраўдная бібліятэка, прыдатная для ўжывання ў працэсе кампіляцыі.

Структура
---------

Імя і характарыстыка кожнай функцыі ўказваюцца ў файле, што завецца загалоўкавым, але бягучая рэфалізацыя функцый апісана асобна ў бібліятэчным файле. Найменаванне і магчымасці загалоўкавых файлаў становяцца агульнымі, але арганізацыя бібліятэк па-ранейшаму застаецца разнатыпный. Стандартная бібліятэка звычайна пастаўляецца разам з кампілятарам. Так як кампілятары мовы C часта забяспечваюць пашыраную функцыянальнасць, не вызначанаю стандартам ANSI C, стандартная бібліятэка аднаго кампілятара можа быць несумяшчальнай са стандартнымі бібліятэкамі іншых кампілятараў.

### Меркаванне аб структуры

Большая частка стандартнай бібліятэкі мовы C робіць уражанне ўдала спраектаванай. Некаторыя асобныя часткі, што давалі перавагу ў мінулым, могуць правакаваць памылкі. Функцыі радковага ўводу `gets()` (і ўжыванне `scanf()` для ўводу радкоў) з'яўляюцца крыніцай мноства перапаўненняў буфера, таму большасць дапаможнікаў аб праграмаванні раяць пазбягаць падобных прыёмаў. Функцыя `strcpy()` таксама непрыемна знакаміта. Яшчэ адной неадназначнай функцыяй з'яўляецца `strtok()` — функцыя, распрацаваная як просты лексічны аналізатар, але мае мноства «падводных камянёў» і таму вельмі складаная ва ўжыванні.

`stdio` досыць абмежаваны (вельмі высокі ўзровень для ўжывання ў многіх сітуацыях) і стандарт не дазваляе карыстальніку самастойна перапрызначаць або пашыраць яго ўласцівасці. У выніку, для мноства пракладанняў распрацоўваюцца ўласныя бібліятэкі-абгорткі вакол механізмаў ніжэйшага ўзроўню і функцый, рэалізаваных аперацыйнамі сістэмамі POSIX-класа. Напрыклад, `stdio` не працуюць з сігналамі або асінхроннымі непакетнымі рэжымамі ўводу-вываду, яія шырока ўжываюцца ў сеціўных серверах. У выніку, на функцыі `stdio` могуць цалкам палагацца толькі серверы, што выкарыстоўваюць мадэль целага працэса для кліента, для абслугоўвання іх на POSIX-сумяшчальных сістемах у пакетным рэжыме ўводу-вываду.

Пэўных функцый стандартнай бібліятэкі варта пазбягаць пры распрацоўцы шматпатокавых пракладанняў. Прымітывы кантролю патокаў прызначаліся для астатняй часткі АС і ігнаруюць агульныя стандарты, як напрыклад, бібліятэку патокаў POSIX, бяркуючы, што праграмісты мовы C самастойна аб гэтым паклапоцяцца, працуючы з паўторным выкарыстаннем і сінхранізацыяй. Ні мова C, ні яго стандартная бібліятэка ніяк не правяраюць падобныя сістэмаспецыфічныя вынікі.

Гісторыя
--------

Мова праграмавання Сі да стандартызацыі не забяспечвала ўбудаванай функцыянальнасці, як напрыклад аперацыі ўводу-вываду (у адрозненні ад такіх традыцыйных моў, як COBOL і FORTRAN). Пазней у суполцы праграмістаў, што працавалі з мовай Сі, зарадзіліся ідэі, якія рэалізаваліся ў тое, што мы зараз называем **Стандартнай бібліятэкай мовы Сі**, для падтрымкі гэтай функцыянальнасці. Большасць гэтых ідэй у выніку аб'ядналіся ў вызначэнне стандарту мовы праграмавання Сі.

І Unix, і Сі былі створаны ў AT&T’s Bell Laboratories на прыканцы 1960-х — пачатку 1970-х. У 1970-я мова праграмавання Сі пачала карыстацца неверагоднай папулярнасцю. Мноства універсітэтаў і арганізацый пачалі ствараць уласныя варыянты мовы, больш прыдатная для ўласных патрэбаў. На пачатку 1980-х праблемы сумяшчальнасці паміж рознымі рэалізацыямі мовы Сі сталі надта відавочнымі. У 1983 годзе Амерыканскі нацыянальны інстытут стандартаў (ANSI) сфармаваў камітэт для прыняцца стандарту мовы Сі, вядомы як «ANSI C». Гэта праца вылілася ў стварэнне так званага стандарта **C89** у 1989 годзе. Частка выніковага стандарта была наборам бібліятэк, названай **Стандартная бібліятэка ANSI C**.

Наступныя версіі стандарту мовы Сі дадавалі некаторыя новыі і найбольш карысныя загалоўкавыя файлы ў бібліятэку. падтрымка гэтых новых пашырэнняў залежала ад рэалізацыі.

Загалоўкавыя файлы **<iso646.h>**, **<wchar.h>** і **<wctype.h>** былі даданы ў *Дадатак 1* (*Normative Addendum*, скарочана **NA1**) — пашырэнне да стандарта мовы Сі, ратыфікаваным у 1995.

Загалоўкавыя файлы **<complex.h>**, **<fenv.h>**, **<inttypes.h>**, **<stdbool.h>**, **<stdint.h>** і **<tgmath.h>** былі даданы ў **C99**, версіі Стандарту мовы Сі, апублікаваным у 1999.

Стандарт ANSI
-------------

Стандартная бібліятэка ANSI C складаецца з 24 загалоўкавых файлаў, кожны з якіх можна далучыць да праграмнага праекта з дапамогай адной дырэктывы. Кожны загалоўкавы файл змяшчае аб'яўленні адной ці болей функцый, вызначэнні тыпаў даных і макрасы. Змест гэтых загалоўкавых файлаў пералічваецца ніжэй.

У параўнанні з некаторымі іншымі мовами (напрыклад Java) стандартная бібліятэка надзвычай меленькая. Библіятэка забяспечвае падтрымку асноўнага набору матэматычных функцый, апрацоўку радкоў, канвертацыю тыпаў, файлавы і кансолны ўвод-вывад. Яна не змяшчае стандартны набор «кантэйнерных тыпаў», як стандартная бібліятэка шаблонаў C++, кампаненты для работы з графічным інтерфейсам карыстальніка (GUI), сеткай і іншай разнастайнай функцыянальнасцю, якую Java падтрымлівае паводле стандарта. Галоўнай перавагай маленькай стандартнай бібліятэкі з'яўляецца спрашчэнне працы за асяроддзем ANSI C у параўнанні з іншымі мовамі, і спрашчэнне партавання праграм на мове Сі на новыя платформы.

Мноства іншых бібліятэк было распрацавана для падтрымкі падобнай функцыянальнасці, што забяспечваецца іншымі мовамі ў іх стандартных бібліятэках. Напрыклад, у праекце распрацоўкі асяроддзя рабочага стала GNOME быў распрацаваны набор графічных інструментаў GTK+ і GLib — бібліятэка кантэйнерных структур даных, як і мноства іншых вядомых прыкладаў. Разнастайнасць даступных бібліятэк значыць, што некаторыя інструменты верхняга ўзроўню з уягам часу пацвердзілі сваю карысць. Значным мінусам з'яўляецца тое, што яны часто не надта добра ўзаемадзейнічаюць адзін з адным, таму праграмістам зачастую больш звыкла працаваць з рознымі наборамі бібліятэк, а іх наборы могуць быць даступнымі на розных спецыфічных платформах.

### Бібліятэчныя загалоўкавыя файлы ANSI C з пашырэннямі C99 і C11

|  |  |
| --- | --- |
|  **<assert.h>** | Змяшчае макрас сцверджанняў, ужываны дзеля выяўлення лагічных і некаторых іншых тыпаў памылак у програме на стадыі адладкі. |
|  **<complex.h>** | Набор функцый для працы з камплекснымі лікамі. (З'явіўся ў **C99**) |
|  **<ctype.h>** | Змяшчае функцыі, што ўжываюцца для класіфікацыі сімвалаў паводле іх тыпаў або для канвертацыі паміж верхнім і ніжнім рэгістрамі незалежна ад ужыванага набора сімвалаў (звычайна ASCII ці адно з яго пашырэнняў, хоць ёсць і рэалізацыі, што выкарыстоўваюць EBCDIC). |
|  **<errno.h>** | Для праверкі кодаў памылак, якія вяртаюць бібліятэчныя функцыі. |
|  **<fenv.h>** | Для кіравання асяроддзем, якое выкарыстоўвае лікі з рухомай коскай. (З'явіўся ў **C99**) |
|  **<float.h>** | змяшчае загадзя вызначаныя канстанты, якія апісваюць спецыфіку рэалізацыі ўласцівасцяў бібліятэкі для працы з лікамі з рухомай коскай, як напрыклад, мінімальная розніца паміж двума рознымі лікамі з рухомай коскай (\_EPSILON), максімальную колькасць лічбаў дакладнасці (\_DIG) і вобласць дапушчальных лікаў (\_MIN, \_MAX). |
|  **<inttypes.h>** | Для дакладнай канвертацыі цэлых тыпаў. (З'явіўся ў **C99**) |
|  **<iso646.h>** | Для праграмавання ў кадзіроўцы ISO 646. (З'явіўся ў **NA1**) |
|  **<limits.h>** | Змяшчае загадзя вызначаныя канстанты, што вызначаюць спецыфіку рэалізацыі ўласцівасяў цылых тыпаў, як напраклад, вобласть дапушчальных значэнняў (\_MIN, \_MAX). |
|  **<locale.h>** | Для setlocale() і звязаных канстант. Выкарыстоўваецца для выбару адпаведнай мовы. |
|  **<math.h>** | Для вылічэння асноўных матэматычных функцый |
|  **<setjmp.h>** | Аб'яўляе макрассы setjmp і longjmp, ужываныя для нелакальных пераходаў |
|  **<signal.h>** | Для кіравання апрацоўкай сігналаў |
|  **<stdarg.h>** | Для доступу да рознай колькасці аргументаў, перадаваных функцыі. |
|  **<stdbool.h>** | Для булевых тыпов даных. (З'явіўся ў **C99**) |
|  **<stdint.h>**  | Для вызначэння разнастайных тыпаў цэлых лікаў. (З'явіўся ў **C99**) |
|  **<stddef.h>** | Для вызначэння некалькіх стандартных тыпаў і макрасаў. |
|  **<stdio.h>** | Рэалізуе асноўныя магчымасці ўводу і вываду ў мове Сі. Гэты файл змяшчае вельмі папулярную функцыю `printf`. |
|  **<stdlib.h>** | Для выканання мноства аперацый, уключаючы канвертацыю, генерацыю псеўдавыпадковых лікаў, выдаткоўванне памяці, кантроль працэсаў, асяроддзя, сігналаў, пошуку і сартавання. |
|  **<string.h>** | Для працы з разнастайнымі тыпамі радкоў. |
|  **<tgmath.h>** | Для тыповых матэматычных функцый. (З'явіўся ў **C99**) |
| <threads.h> | Загалоўкавы файл <threads.h> поруч з <stdatomic.h> прадастаўляе падтрымку для паралельнага праграмавання. (З'явіўся ў **C11**) |
|  **<time.h>** | Для канвертацыі паміж рознымі фарматамі часу і даты. |
|  **<wchar.h>** | Для апрацоўкі «шырокіх» патокаў і некалькіх відаў радкоў з дапамогай «шырокіх» сімвалаў (падтрымка набору моў). (З'явіўся ў **NA1**) |
|  **<wctype.h>** | Для класіфікацыі «шырокіх» сімвалаў. (З'явіўся ў **NA1**) |

Стандартная бібліятэка Сі ў іншых мовах
---------------------------------------

Некаторыя мовы забяспечваюць функцыянальнасць стандартнай бібліятэкі Сі з дапамогай сваіх уласных бібліятэк. Бібліятэка можа быць адаптавана для структур мовы, але семантыка аперацый застаецца падобнай. Мова праграмавання C++ змяшчае функцыянальнасць стандартнай бібліятэкі ANSI C у прасторы імёнаў **std** (напрыклад `std::printf`, `std::atoi`, `std::feof` і інш.), у загалоўкавых файлах з падобнымі імёнамі як у Сі («`cstdio`», «`cmath`», «`cstdlib`» и т. д.). Да іншых моў, у якіх ужываюцца падобныя падыходы, належыць D і Python. У апошнім убудаваны аб'ект **file** вызначаны як *«рэалізаваный з дапамогай пакета stdio мовы Сі» Архівавана 28 верасня 2008.*, так што даступныя аперацыі (адкрыццё, чытанне, запіс і інш.), як чакаецца, павінны мець паводзіны, як у адпаведных функцый мовы Сі.

Агульная падтрымка бібліятэк
----------------------------

Пакуль не стандартызавана, але праграмы на мове Сі могуць залежыць ад бібліятэк падпраграм, якія змяшчаюць код, ужываны кампілятарам падчас працы. Код, што ініцыялізуе працэс для аперацыйнай сістэмы перад выклікам `main()`, рэалізаваны ў бібліятэцы "падчас выканання" мовы Сі (C Run-Time Library, CRT) для бягучай версіі кампілятара. Код бібліятэкі CRT можа дапамагчы з рэалізацыяй іншых асаблівасцяў мовы, як напрыклад апрацоўка неперахопленых выключэнняў або рэалізация працы з лікамі з рухомай коскай.

Стандартная бібліятэка мовы Сі толькі рэгламентуе наяўнасць вышэйзгаданых падпраграм і іх паводзіны. Так як рэалізацыя кампілятара можа залежыць ад наяўнасці гэтых дадатковых функцый, то ўсё залежыць ад таго, якіе падпраграмы змешчаны ў Стандартную бібліятэку мовы Сі, такім чыгам любая праграма, што распрацавана з іх дапамогай, будзе залежыць мець у іх патрэбу.

Убудавагыя функцыі кампілятара
------------------------------

Некаторыя кампілятары (напрыклад, GCC) падтрымліваюць унутраныя версіі мноства функцый Стандартнай бібліятэкі мовы Сі; то бок, рэалізацыі функцый запісваюцца ў кампіляваны аб'ектны модуль, а праграма выклікае ўнутраныя версіі замест функцый агульнай бібліятэкі Сі. Гэто змяньшае накладные выдаткі на выклік функцыі, асабліва калі выклік функцыі замяняецца ўбудаванымі варыянтамі, і дазваляецца выкарыстанне іншых форм аптымізацыі (калі кампілятар падтрымлівае кіраванне характарыстыкамі ўнутраных варыянтаў), але можа прыводзіць да праблемаў пры адладцы (унутраныя версіі не могуцб быць замененыя інструментальнымі версіямі для праверкі).

Стандартная бібліятэка POSIX
----------------------------

Асноўны артыкул: **C POSIX library**
POSIX (і SUS) вызначае колькасць падпраграм, якія могуць быць даступныя апроч вызначаных у Стандартнай бібліятэцы мовы Сі; яны часта рэалізуюць аналагічную функцыянальнасць са Стандартнай бібліятэкай з рознай ступенню падабенства. Напрыклад, glibc рэалізуе такія функцыі як fork у libc.so, аде перад выклікам бібліятэкі патокаў яднаюцца ў glibc, хоцб гэта заяўлена як асобная бібліятэка з уласным флагам лінкавальніка. Зачастую, такая POSIX-сумяшчальная функцыянальнасць разглядаецца як частка бібліятэкі; адпаведная бібліятэка Сі можа быць ідэнтыфікавана як ANSI ці ISO бібліятэка мовы Сі.

Рэалізацыі
----------

Існуе мноства рэалізацый, што пастаўляюцца як з рознымі аперацыйнымі сістэмамі, так і з кампілятарамі мовы Сі. На BSD сістэмах сістэманя бібліятэка ўбудавана ў аперацыйную сістэму і падтрымліваецца агульным рэпазітарам коду. На большасці сістэм бібліятэка можа быць знойдзена пад імем «`libc`».

Хоць існуе вельмі шмат рэалізацый, вомь невялікі спіс самых папулярных бібліятэк:

* GNU C Library — самая распаўсюджаная рэалізацыя, ужываная ў Linux
* Microsoft C Run-time Library
* dietlibc — альтэрнатыўная невялікая рэалізацыя Стандартнай бібліятэкі мовы Сі
* uClibc — Стандартная бібліятэка мовы Сі для ўбудаваных сістэм на базе Linux
* Newlib — Стандартная бібліятэка мовы Сі для ўбудаваных сістэм (MMU-less)
* klibc — выкарыстоўваецца пераважна для загрузкі Linux-сістэм.
* eglibc — разнавіднасць glibc для ўбудаваных сістэм.

Гл. таксама
-----------

* Спіс функцый стандартнай бібліятэкі C
* Стандартная бібліятэка мовы C++

Зноскі
------

1. ↑  Other built-in functions provided by GCC, Дапаможнік па GCC
2. ↑  Re: Ці падтрымлівае Newlib працэсары без mmu?

Дадатковыя крыніцы
------------------

* Дапаможнік Карыстальніка для працы з Бібліятэкай Сі Архівавана 18 студзеня 2015.
* Microsoft Бібліятэкі выканання Мовы Сі у MSDN
* NetBSD Дапаможніе па Бібліятэкам Сі Архівавана 23 снежня 2015. і поўныя заходныякоды бібліятэкі Сі: Добрыя акадэмічныя даведнікі.

| ⛭Мова праграмавання Сі |
| --- |
| 
* ANSI C
	+ C89 і C90
* C99
* C11

 |
| Кампілятары | 
* Borland Turbo C
* Clang
* GCC
* LCC
* Pelles C
* PCC
* TCC
* Visual C++ (C++/CLI
* C++/CX)
* Watcom C/C++ compiler

 |
| Бібліятэкі | 
* Стандартная бібліятэка C
* glibc
* dietlibc
* uClibc
* Newlib
* Eglibc
* Bionic

 |
| Асаблівасці | 
* C-радок
* Сінтаксіс
* Прэпрацэсар
* Загалоўкавыя файлы
* Тыпы і аб'явы пераменных
* Функцыі

 |
| Некаторыя нашчадкі | 
* C++
* C#
* D
* Objective-C
* Java
* Alef
* Limbo
* Go
* Vala

 |
| C і іншыя мовы | 
* C і C++ (Сумяшчальнасць
* Аператары)
* Параўнанне Pascal і C
* Кампілятар C у байт-код Java

 |