C/Biblioteka standardowa
Po co nam biblioteka standardowa?
[edytuj]W którymś z początkowych rozdziałów tego podręcznika napisane jest, że czysty język C nie może zbyt wiele. Tak naprawdę, to język C sam w sobie praktycznie nie ma mechanizmów do obsługi np. wejścia-wyjścia. Dlatego też większość systemów operacyjnych posiada tzw. bibliotekę standardową zwaną też biblioteką języka C.[1] To właśnie w niej zawarte są podstawowe funkcjonalności, dzięki którym twój program może np. napisać coś na ekranie.
Jak skonstruowana jest biblioteka standardowa?
[edytuj]Zapytacie zapewne, jak biblioteka standardowa realizuje te funkcje, skoro sam język C tego nie potrafi. Odpowiedź jest prosta - biblioteka standardowa nie jest napisana w samym języku C. Ponieważ C jest językiem tłumaczonym do kodu maszynowego, to w praktyce nie ma żadnych przeszkód, żeby np. połączyć go z językiem niskiego poziomu, jakim jest np. asembler. Dlatego biblioteka C z jednej strony udostępnia gotowe funkcje w języku C, a z drugiej za pomocą niskopoziomowych mechanizmów[2] komunikuje się z systemem operacyjnym, który wykonuje odpowiednie czynności.
Wersje
[edytuj]- libc[3]
- musl = "an implementation of the standard library for Linux-based systems"
- glibc = GNU libc[4]
- eglibc =
- uClibc – implementacja standardowej biblioteki języka C dla systemów osadzonych (ang. embedded)
- Diet libc – „odchudzona” wersja standardowej biblioteki języka C
- safe libc
Trzy pliki nagłówkowe deiniują funkcje warunkowe, których implementacje nie muszą obsługiwać:
- complex.h
- stdatomic.h
- threads.h
Standard POSIX dodał kilka niestandardowych nagłówków C dla funkcji specyficznych dla systemu Unix, które mogą znaleźć się w innych architekturach
- fcntl.h
- unistd.h
Szereg innych grup używa innych niestandardowych nagłówków – GNU C Library ma alloca.h, a HP OpenVMS ma funkcję va_count().
Jak sprawdzić której wersji używa mój system ?[5]
- ldd
- getconf
ldd --version
przykładowy wynik :
ldd (Ubuntu GLIBC 2.23-0ubuntu3) 2.23 Prawa autorskie © 2016 Free Software Foundation, Inc. To oprogramowanie jest darmowe; warunki kopiowania są opisane w źródłach. Autorzy nie dają ŻADNYCH gwarancji, w tym również gwarancji MOŻLIWOŚCI SPRZEDAŻY lub PRZYDATNOŚCI DO KONKRETNYCH ZASTOSOWAŃ. Autorami są Roland McGrath i Ulrich Drepper.
getconf GNU_LIBC_VERSION
Safe libc
[edytuj]Biblioteka Safe C udostępnia powiązane funkcje sprawdzania pamięci i łańcuchów zgodnie z normą ISO/IEC TR24731. Funkcje te są funkcjami alternatywnymi do istniejącej standardowej biblioteki C, które promują bezpieczniejsze, bezpieczniejsze programowanie. Języki programowania ISO / IEC — specyfikacja C, C11, obejmują teraz ograniczone interfejsy API w dodatku K, „Interfejsy sprawdzania granic”.
Instalacja:
sudo apt install libsafec-dev
musl
[edytuj]sudo apt install musl-tools
git clone git.musl-libc.org/musl
Lokalizacja kompilatora
- w pliku makefile:
CC = /usr/bin/musl-gcc
Gdzie są funkcje z biblioteki standardowej?
[edytuj]Pisząc program w języku C używamy różnego rodzaju funkcji, takich jak np. printf. Nie jesteśmy jednak ich autorami, mało tego nie widzimy nawet deklaracji tych funkcji w naszym programie. Pamiętacie program "Hello world"? Zaczynał on się od takiej oto linijki:
#include <stdio.h>
linijka ta oznacza: "w tym miejscu wstaw zawartość pliku stdio.h". Nawiasy "<" i ">" oznaczają, że plik stdio.h znajduje się w standardowym katalogu z plikami nagłówkowymi. Wszystkie pliki z rozszerzeniem h są właśnie plikami nagłówkowymi. Wróćmy teraz do tematu biblioteki standardowej. Każdy system operacyjny ma za zadanie wykonywać pewne funkcje na rzecz programów. Wszystkie te funkcje zawarte są właśnie w bibliotece standardowej. W systemach z rodziny UNIX nazywa się ją LibC (biblioteka języka C). To tam właśnie znajduje się funkcja printf,[6] scanf, puts i inne.
Oprócz podstawowych funkcji wejścia-wyjścia, biblioteka standardowa udostępnia też możliwość wykonywania:[7]
- funkcji matematycznych
- komunikacji przez sieć
oraz wykonywania wielu innych rzeczy.
Nazwa | Od | opis |
---|---|---|
<assert.h> |
Zawiera makro assert, które pomaga w wykrywaniu błędów logicznych i innych typów błędów w debugowaniu wersji programu | |
<complex.h> |
C99 | Zestaw funkcji dla liczb zespolonych |
<ctype.h> |
Zestaw funkcji służących do klasyfikowania znaków według ich typów lub konwersji między dużymi i małymi literami w sposób niezależny od używanego zestawu znaków (zwykle ASCII lub jedno z jego rozszerzeń, chociaż znane są również implementacje wykorzystujące EBCDIC) | |
<errno.h> |
Do testowania kodów błędów zgłaszanych przez funkcje biblioteczne | |
<fenv.h> |
C99 | zestaw funkcji dla liczb zmiennoprzecinkowych |
<float.h> |
Definiuje stałe dla makr określające właściwości biblioteki zmiennoprzecinkowej | |
<inttypes.h> |
C99 | Defines exact width integer types. |
<iso646.h> |
C95 | Defines several macros that implement alternative ways to express several standard tokens. For programming in ISO 646 variant character sets. |
<limits.h> |
Defines macro constants specifying the implementation-specific properties of the integer types. | |
<locale.h> |
Defines localization functions | |
<math.h> |
Defines common mathematical functions | |
<setjmp.h> |
Declares the macros setjmp and longjmp , which are used for non-local exits.
| |
<signal.h> |
Defines signal handling functions | |
<stdalign.h> |
C11 | For querying and specifying the alignment of objects. |
<stdarg.h> |
dostęp do zmiennej liczby argumentów przekazywanych do funkcji | |
<stdatomic.h> |
C11 | For atomic operations on data shared between threads. |
<stdbool.h> |
C99 | Defines a boolean data type |
<stddef.h> |
Definiuje kilka przydatnych typów i makr | |
<stdint.h> |
C99 | Definiuje typy całkowite o dokładnej szerokości, zobacz inttypes.h który zawiera stdint.h i dodaje dodatkowe funkcje[8] |
<stdio.h> |
Defines core input and output functions | |
<stdlib.h> |
Defines numeric conversion functions, pseudo-random numbers generation functions, memory allocation, process control functions | |
<stdnoreturn.h> |
C11 | For specifying non-returning functions. |
<string.h> |
Defines string handling functions. | |
<tgmath.h> |
C99 | Defines type-generic mathematical functions. |
<threads.h> |
C11 | Defines functions for managing multiple Threads as well as mutexes and condition variables. |
<time.h> |
Defines date and time handling functions | |
<uchar.h> |
C11 | Types and functions for manipulating Unicode characters |
<unistd.h> |
warunkowy | |
<wchar.h> |
C95 | Definiuje obsługę ciągów szerokich znaków |
<wctype.h> |
C95 | Defines set of functions used to classify wide characters by their types or to convert between upper and lower case |
Jeśli biblioteka nie jest potrzebna...
[edytuj]Czasami korzystanie z funkcji bibliotecznych oraz standardowych plików nagłówkowych jest niepożądane np. wtedy, gdy programista pisze swój własny system operacyjny oraz bibliotekę do niego. Aby wyłączyć używanie biblioteki C w opcjach kompilatora GCC możemy dodać następujące argumenty:
-nostdinc -fno-builtin
Opis funkcji biblioteki standardowej
[edytuj]Podręcznik C na Wikibooks zawiera opis dużej części biblioteki standardowej C:
W systemach uniksowych możesz uzyskać pomoc dzięki narzędziu man, przykładowo pisząc:
man printf
lub
man libc
Uwagi
[edytuj]Programy w języku C++ mogą dokładnie w ten sam sposób korzystać z biblioteki standardowej, ale zalecane jest, by robić to raczej w trochę odmienny sposób, właściwy dla C++. Szczegóły w podręczniku C++.
Indeksy
[edytuj]
Zobacz również
[edytuj]- glib[9] ( nie glibc, bo bez c na końcu) = GLib (G Library) - niskopoziomowa, narzędziowa biblioteka funkcji dla programistów języka C, dostarczająca jednolite API. GLib jest wykorzystywana przede wszystkim jako podstawa biblioteki GTK+ (której była częścią do wydania wersji 1.1.0) oraz graficznego środowiska GNOME.
Przypisy
- ↑ wikipedia: Biblioteka_standardowa_języka_C
- ↑ Początkujący programista zapewne nie byłby w stanie napisać nawet funkcji printf.
- ↑ Biblioteka_standardowa_języka_C w wikipedii
- ↑ wikipedia: GNU_C_Library
- ↑ unix.stackexchange question: what-c-library-version-does-my-system-use
- ↑ Takich jak np. wywoływanie przerwań programowych.
- ↑ devdocs C
- ↑ stackoverflow question : difference-between-stdint-h-and-inttypes-h
- ↑ GLib (G Library) w wikipedii