C Standard Library
C Standard Library (pol. biblioteka standardowa języka C) to zbiór funkcji, makr i typów danych określonych w normie ISO/IEC 9899, czyli w oficjalnym standardzie języka C. Biblioteka zapewnia programistom przenośny dostęp do podstawowych operacji wejścia/wyjścia, manipulacji łańcuchami znaków, alokacji pamięci, obliczeń matematycznych, obsługi czasu i wielu innych zagadnień niezbędnych w praktycznym programowaniu.
Historia
Początkowo funkcje pomocnicze były dostarczane przez poszczególne kompilatory i systemy operacyjne. W 1978 r. wprowadzono pierwszą wersję biblioteki K&R C, a w 1989 r. (standard C89) powstała ustandaryzowana Standard C Library. Następnie w standardach C99, C11 i C18 zestaw nagłówków i ich zawartość był rozbudowywany, ale podstawowa struktura pozostała niezmienna.
Struktura i organizacja
Biblioteka podzielona jest na grupy nagłówków, z których każdy definiuje określony zestaw funkcji i typów. Poniżej przedstawiono najważniejsze grupy oraz najważniejsze nagłówki.
Podstawowe grupy
- Wejście/wyjście – obsługa strumieni, plików i konsoli.
Nagłówki:<stdio.h>,<stdio_ext.h>(POSIX). - Alokacja pamięci i zarządzanie – dynamiczna pamięć, kopiowanie, porównywanie.
Nagłówki:<stdlib.h>,<malloc.h>(niekiedy dodatkowy). - Manipulacja łańcuchami znaków – funkcje operujące na
char*iwchar_t*.
Nagłówki:<string.h>,<strings.h>(POSIX),<wchar.h>. - Operacje matematyczne – funkcje trygonometryczne, logarytmy, stałe.
Nagłówki:<math.h>,<complex.h>(liczby zespolone). - Czas i data – struktury i funkcje do obsługi czasu rzeczywistego.
Nagłówki:<time.h>,<sys/time.h>(POSIX). - Obsługa znaków i klasyfikacja – funkcje klasyfikujące znaki według locale.
Nagłówki:<ctype.h>,<locale.h>. - Definicje stałych i typów – rozmiary, limity i makra.
Nagłówki:<stddef.h>,<stdint.h>,<limits.h>,<float.h>. - Obsługa błędów i diagnostyka – raportowanie błędów, asercje.
Nagłówki:<errno.h>,<assert.h>. - Wielowątkowość (od C11) – funkcje do zarządzania wątkami i synchronizacji.
Nagłówek:<threads.h>(standard C11).
Przykładowa tabela najważniejszych nagłówków
| Nagłówek | Główne grupy funkcji | Przykładowe funkcje |
|---|---|---|
<stdio.h> |
Wejście/wyjście | printf, scanf, fopen, fclose |
<stdlib.h> |
Alokacja pamięci, konwersje, zakończenie programu | malloc, free, atoi, exit |
<string.h> |
Operacje na łańcuchach | strcpy, strlen, strcmp, memcpy |
<math.h> |
Funkcje matematyczne | sin, cos, sqrt, log |
<time.h> |
Obsługa czasu | time, strftime, clock |
Implementacja i przenośność
Choć standard definiuje jedynie interfejs – czyli zestaw nagłówków i ich sygnatur – poszczególne implementacje (np. glibc, musl, MSVCRT) dostarczają własne, wewnętrzne źródła kodu. Przestrzeganie standardu zapewnia, że program napisany z użyciem jedynie funkcji z biblioteki standardowej będzie się kompilował i działał na każdego kompilatora C zgodnego z ISO.
Rozszerzenia systemowe i POSIX
Systemy uniksowe udostępniają dodatkowe nagłówki (np. <unistd.h>, <sys/socket.h>) opisane w standardzie POSIX. Są one szeroko wykorzystywane w programowaniu systemowym, ale nie wchodzą w skład C Standard Library i dlatego nie są przenośne na platformy, które nie implementują POSIX.
Przykładowy program
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
const char *tekst = "C Standard Library";
char *kopi = malloc(strlen(tekst) + 1);
if (!kopi) {
perror("malloc");
return EXIT_FAILURE;
}
strcpy(kopi, tekst);
printf("Tekst: %s\n", kopi);
free(kopi);
return EXIT_SUCCESS;
}
Powyższy króciutki program ilustruje wykorzystanie trzech najważniejszych nagłówków <stdio.h>, <stdlib.h> i <string.h>. Wszystkie funkcje pochodzą wyłącznie z biblioteki standardowej, co gwarantuje ich dostępność na każdej platformie zgodnej ze standardem C.
Wpływ na inne języki
Wiele języków programowania (np. C++, Objective‑C) korzysta z tej samej biblioteki lub implementuje własne wersje zgodne ze specyfikacją C, co ułatwia współdzielenie kodu i integrację z istniejącymi systemami.
Patrząc w przyszłość
Standard ten jest aktywnie rozwijany. Projekt ISO C pracuje nad nowymi dodatkami, takimi jak lepsza obsługa wątków (<threads.h>), rozszerzenia dla liczb zmiennoprzecinkowych (np. <stdnoreturn.h>) oraz mechanizmy zwiększające bezpieczeństwo (np. funkcje *_s wprowadzane w bibliotece C11). Jakkolwiek konkretne implementacje będą się różnić, podstawowa filozofia – zapewnienie przenośnego, wydajnego i minimalnego zestawu narzędzi – pozostaje niezmienna.