C/Biblioteka standardowa
Po co nam biblioteka standardowa?
edytujW 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?
edytujZapytacie 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
edytujBiblioteka 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
edytujsudo 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?
edytujPiszą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...
edytujCzasami 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
edytujPodrę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
edytujProgramy 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