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.
WersjeEdytuj
- libc
- musl = "an implementation of the standard library for Linux-based systems"
- glibc = GNU libc[3]
- eglibc =
- uClibc – implementacja standardowej biblioteki języka C dla systemów osadzonych (ang. embedded)
- Diet libc – „odchudzona” wersja standardowej biblioteki języka C
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 ?[4]
- 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
muslEdytuj
sudo apt install musl-tools
git clone git.musl-libc.org/musl
Lokalizacja kompilatora
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,[5] scanf, puts i inne.
Oprócz podstawowych funkcji wejścia-wyjścia, biblioteka standardowa udostępnia też możliwość wykonywania:
- 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> |
NA1 | 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[6] |
<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> |
NA1 | Defines wide string handling functions. |
<wctype.h> |
NA1 | 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 standardowejEdytuj
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
UwagiEdytuj
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++.
IndeksyEdytuj
Przypisy
- ↑ wikipedia: Biblioteka_standardowa_języka_C
- ↑ Początkujący programista zapewne nie byłby w stanie napisać nawet funkcji printf.
- ↑ wikipedia: GNU_C_Library
- ↑ unix.stackexchange question: what-c-library-version-does-my-system-use
- ↑ Takich jak np. wywoływanie przerwań programowych.
- ↑ stackoverflow question : difference-between-stdint-h-and-inttypes-h