1.2 Die C-Standardbibliothek
Auch wenn dieses Buch keine Referenz für die Standardbibliothek enthält, sollten Sie dennoch ihren Sinn kennen, denn so haben Sie es später leichter. Der Sprachkern von C bietet nämlich keinerlei erweiterte Funktionen. Dies zu verschweigen, könnte zu Irritationen führen, die wir Ihnen natürlich ersparen möchten. Weil C nämlich so kompakt wie möglich sein soll, bietet der Sprachkern, im Gegensatz zu mancher anderen Programmiersprache, nicht einmal eine direkte Unterstützung für die Ein- und Ausgabe über die Tastatur oder den Bildschirm. Hierzu werden extra Module von der Standardbibliothek angeboten. In welchem Umfang die Standardbibliothek vorhanden sein muss, hängt von Ihrer Umgebung ab. So bietet z. B. der C-Compiler für einen Mikrocontroller wie den Arduino keine direkte Anbindung an externe Bildschirme, der GCC-Compiler für Linux hingegen schon.
Bei einer betriebssystemgestützten Implementierung, mit der es wohl die meisten Leser beim Erlernen der Sprache C zunächst zu tun haben, muss die C-Standardbibliothek in vollem Umfang vorhanden sein, wenn ein Compiler sich als standardkonform bezeichnen will. Die betriebssystemgestützte Implementierung wird auch als hosted environment bezeichnet. Das Betriebssystem wird oft als Host (Gast) bezeichnet, von dem sich der C-Compiler Funktionen – wie z. B. die Zeicheneingabe über die Tastatur – leiht. Was ein Compiler ist und wie er funktioniert, ist natürlich ebenfalls Bestandteil dieses Buches.
Wenn Sie C im Embedded-Bereich verwenden, haben Sie es in der Regel mit einer sogenannten freistehenden Implementierung zu tun. Diese Form der Umgebung muss nur einen bestimmten Teil der Standardbibliothek anbieten, damit sie als standardkonform bezeichnet werden kann. Die freistehende Implementierung bzw. freistehende Umgebung wird auch als freestanding environment bezeichnet. Eine solche Umgebung ist beispielsweise die Arduino-IDE. In diesem Buch werden wir natürlich nicht auf den Arduino oder andere Mikrocontroller eingehen, hierzu gibt es gesonderte Literatur. Dennoch können Sie, wenn Sie C auf Ihrem PC lernen, mit ein wenig Übung auch C-Programme für den Arduino erstellen.
1.2.1 Header-Dateien und Programmbibliothek
Der Aufbau der Standardbibliothek bleibt Ihnen als Entwickler häufig verborgen. Dies ist auch gut so, denn Sie wollen ja schließlich nicht stets den ganzen Quellcode von stdio.h sehen müssen, wenn Sie nur »Hallo Welt« auf dem Bildschirm ausgeben wollen. stdio.h ist die Header-Datei aus der Standardbibliothek, die für die Bildschirmausgabe gebraucht wird. Header-Dateien werden in den folgenden Kapiteln noch ausführlich besprochen. An dieser Stelle ist es uns nur wichtig, dass Sie verstehen, dass die C-Bibliothek aus vielen unterschiedlichen Modulen besteht, die Sie bei Bedarf per Hand hinzufügen können. In den kommenden Programmen werden Sie bei jedem Beispiel sogenannte Header-Dateien mit der Dateiendung *.h hinzufügen. In diesen Header-Dateien werden u. a. fertige Funktionen angeboten, die im weiteren Verlauf verwendet werden können, wenn die Header-Dateien eingebunden wurden. Somit müssen Sie viele Funktionen nicht selbst programmieren, sondern können diese schlicht mit einer einzigen Programmzeile aufrufen. Wie Sie Funktionen aufrufen und diesen Parameter übergeben (und natürlich, was Parameter sind), ist auch Bestandteil dieses Buches.
Der tatsächliche Inhalt bzw. die Implementation der Funktionen ist dann in die Programmbibliothek ausgelagert. Genau deshalb müssen Sie dann den entsprechenden Quellcode auch nicht sehen, wenn Sie dies nicht wollen. Der Quellcode oder Quelltext bezeichnet das C-Programm, genauso, wie Sie es eingegeben haben.
Bei Header-Dateien und der Programmbibliothek handelt es sich also um zwei unterschiedliche Dinge: Meistens sind Header-Dateien separate einzelne Dateien, deren Namensgebung vom Standard genormt wird. Die Implementierung der Programmbibliothek wird hingegen in der Regel vom Compiler-Hersteller verwaltet und kann daher variieren. Manchmal gibt es auch zusätzliche Bibliotheken, die über die Standardbibliothek hinausgehen, wie z. B. die Windows-API. Die Windows-API wurde von Microsoft entwickelt, um Standardfunktionen von Windows (wie z. B. das Verwalten von Fenstern) für jeden Anwendungsentwickler verfügbar zu machen. Unter Linux ist z. B. das GTK-Toolkit ein Beispiel für über den Standard hinausgehende Bibliotheken für sogenannte GUI-Anwendungen. GUI ist die Abkürzung für Graphic User Interface und bezeichnet allgemein eine grafische Benutzeroberfläche mit Fenstern und Symbolen.
Übersicht zu den Header-Dateien
In Tabelle 1.1 finden Sie einen Überblick zu den verschiedenen Header-Dateien, die Ihnen seit C11 zur Verfügung stehen. Da es wohl immer noch Compiler gibt, die den C11-Standard nur teilweise bis gar nicht implementiert haben, sehen Sie auch, ab welchem Standard die entsprechende Header-Datei der Standardbibliothek vorhanden ist.
Standard |
Bedeutung |
|
---|---|---|
<assert.h> |
C89/C90 |
Assertions; Fehlersuche |
<complex.h> |
C99 |
komplexe Zahlenarithmetik |
<ctype.h> |
C89/C90 |
Test auf bestimmte Zeichentypen |
<errno.h> |
C89/C90 |
Makros mit Fehlercodes |
<fenv.h |
C99 |
Einstellungen für die Gleitkommaberechnungen |
<float.h> |
C89/C90 |
Limits für Gleitkommazahlen |
<inttypes.h> |
C99 |
Konvertierungsfunktionen für Ganzzahltypen |
<iso646.h> |
C95/NA1 |
alternative Schreibweise für logische und bitweise Operatoren |
<limits.h> |
C89/C90 |
Größe eingebauter Typen |
<locale.h> |
C89/C90 |
Einstellungen des Gebietsschemas |
<math.h> |
C89/C90 |
mathematische Funktionen |
<setjmp.h> |
C89/C90 |
nicht lokale Sprünge |
<signal.h> |
C89/C90 |
Signalverarbeitung |
<stdalign.h> |
C11 |
Makros für Speicherausrichtung |
<stdarg.h> |
C89/C90 |
variable Anzahl von Argumenten |
<stdatomic.h> |
C11 |
Typen für atomare Operationen für Threads |
<stdbool.h> |
C99 |
boolesche Variablen |
C89/C90 |
zusätzliche Typdefinitionen |
|
<stdint.h> |
C99 |
Ganzzahltypen mit fester Breite |
<stdio.h> |
C89/C90 |
Ein-/Ausgabe |
<stdlib.h> |
C89/C90 |
allgemeine Standardfunktionen |
<stdnoreturn.h> |
C11 |
Definition des No-return-Makros |
<string.h> |
C89/C90 |
Funktionen für Zeichenketten |
<tgmath.h> |
C99 |
typgenerische Makros für mathematische Funktionen |
<threads.h> |
C11 |
Unterstützung von Multithreads |
<time.h> |
C89/C90 |
Datum und Uhrzeit |
<uchar.h> |
C11 |
Unterstützung von Unicode-Zeichen (UTF-16- und UTF-32-kodiert) |
<wchar.h> |
C95/NA1 |
Unterstützung für Unicode-Zeichen |
<wctype.h> |
C95/NA1 |
wie <ctype.h>, nur für Unicode |