Ein Angebot von

C programmieren: Präprozessor und Standardbibliothek

| Autor / Redakteur: Prof. Dr. Christian Siemers * / Sebastian Gerstl

C umfasst eine nkleinen Sprachkern mit einer Standardbibliothek, die Nutzer beim Programmieren in C an ihren eigenen Bedarf anpassen können.
C umfasst eine nkleinen Sprachkern mit einer Standardbibliothek, die Nutzer beim Programmieren in C an ihren eigenen Bedarf anpassen können. (Bild: gemeinfrei / CC0)

Programmieren in C zeichnet sich besonders durch die hohe Flexibilität der Programmiersprache aus. Möglich machen dies der Präprozessor zum Vorverarbeiten des Codes und eine an individuelle Bedürfnisse anpassbare Standardbibliothek.

Der C-Präprozessor

Wie wird C-Code nun verarbeitet? Zu Beginn der Ausführungen zu den syntaktischen Elementen in der C-Programmierung (speziell im Bereich Definitionen und Deklarationen) war bereits einmal vom C-Präprozessor die Rede. Diesem obliegt die Vorverarbeitung des C-Quelltexts zur sogenannten Übersetzungseinheit (translation unit), die dann dem eigentlichen Compiler zur Weiterverarbeitung übergeben wird. Er arbeitet als zeilenorientierte Textersetzungsmaschine und versteht die C-Syntax nicht.

Seine Aufgabe ist es, jede Zeile mit einem newline character abzuschließen, unabhängig von der äußeren Form einer Textzeile, durch ihre Entsprechungen zu ersetzen, Zeilen, die mit einem Rückschrägstrich enden, zusammenzufügen, Zeichengruppen zu ersetzen (z.B. Escape-Sequenzen, Makros), Leerraum zu kondensieren, Kommentare (/* ... */) zu entfernen und durch ein Leerzeichen zu ersetzen, Direktiven auszuführen (auch wiederholt und rekursiv), und Dateien einzufügen (mit denen er dann rekursiv das gleiche anstellt).

Präprozessordirektiven werden mit # eingeleitet. Sie beginnen traditionell am linken Rand und stehen auf einer logischen Zeile. Es gibt folgende Direktiven:

  • include <datei.h> : Standard-Header hier einfügen
  • #include „datei.h“ : eigenen Header hier einfügen
  • #define DIES jenes 17 überall : >DIES< durch >jenes 17< ersetzen, sogenanntes Makro
  • #undef XXX : Makrodefinition XXX entfernen
  • #line 47 : nächste Zeilennummer in der Datei
  • #error „some failure!“ : zur Compilierzeit Fehlermeldung erzeugen
  • #pragma builtin(xyz) : implementationsdefinierte Option
  • #ifdef FEATURE : bedingte Compilierung
  • #ifndef FEATURE : bedingte Compilierung
  • #if : bedingte Compilierung
  • #elif : bedingte Compilierung
  • #else : bedingte Compilierung
  • #endif : bedingte Compilierung
  • defined : optional zur Verwendung mit #if und #elif

Präprozessor-Makronamen, wie oben z.B. DIES, XXX und FEATURE, werden traditionsgemäß meist komplett in Großbuchstaben geschrieben, führende Unterstriche sind für das System reserviert und sollten nicht verwendet werden.

Der Präprozessor ist eine reine Textersetzungsmaschine, ohne jegliche Kenntnis von C! Semantische Klarheit von Quellcode hat heutzutage jedoch höchste Priorität. Daher ist der moderne Trend in der Anwendungsentwicklung (ca. seit Beginn der 90er Jahre), den Präprozessor nur noch für einfache Makros sowie Inklusion und – falls notwendig – bedingte Compilierung einzusetzen. In der Systemsoftware sieht es allerdings etwas anders aus, wie man leicht beim Studium der Headerdateien feststellen kann. Man traut den Systemprogrammierern offenbar mehr Durchblick und Disziplin zu!

Die C-Standardbibliothek

Während es bei früheren Programmiersprachen allgemein üblich war, die Bedienung der Peripherie, Ein- und Ausgabebefehle, Formatieranweisungen für den Druck, spezielle, für den prospektiven Anwendungsbereich erforderliche mathematische oder textverarbeitende Funktionen und ähnliches alles in der Sprache selbst unterzubringen, wurde C von Anfang an ausgelegt, einen möglichst kleinen Sprachkern in Verbindung mit einer Standardbibliothek zu verwenden. Die Sprache sollte es dem Benutzer auf einfache Weise ermöglichen, diese Bibliothek seinem Bedarf anzupassen und auf Wunsch beliebig zu erweitern. Diese Entwurfsphilosophie ist eines der Hauptkennzeichen von C geblieben.

Zur Sprache C gehört eine Standardbibliothek (standard C library), deren Programmierschnittstelle (application programmer interface, API) über die weiter unten aufgelisteten, insgesamt 18 sog. Header-Dateien definiert wird. Sie enthalten die Definitionen für Makros und Datentypen, sowie die Deklarationen von Namen und Funktionen in den entsprechenden Abschnitten der Bibliothek.45383363

Die 18 Header-Dateien der C-Standardbibliothek sind:

<assert.h> <ctype.h> <errno.h> <float.h> <limits.h> <locale.h> <math.h> <setjmp.h> <signal.h> <stdarg.h> <stddef.h> <stdio.h> <stdlib.h> <string.h> <time.h> <iso646.h> <wchar.h> <wctype.h>

Die Anbindung entsprechender Abschnitte der Standardbibliothek sollte im Quelltext immer über die Einbindung der jeweils zutreffenden Header mittels der zuvor erwähnten #include <...> Präprozessoranweisungen geschehen, um die notwendigen Definitionen alle korrekt zu übernehmen.

Die Einbindung der jeweiligen Teile der Objektbibliothek durch den Linker geschieht meist automatisch, zuweilen ist es jedoch notwendig, bestimmte Teile – oft die zu math.h gehörenden Funktionen – mittels spezieller Linkeroptionen bei der Compilierung explizit anzufordern.

In den vergangene vier Beiträgen haben wir uns ein grundlegendes Wissen über die lexikalischen Elemente in C sowie dem syntaktischen Aufbau der Programmiersprache verfasst. Geschriebener Code muss allerdings auch verarbeitet werden, damit ein System das Programm auch erkennt und verarbeiten kann. Im nächsten Beitrag beleuchten wir daher näher, wie der C-Compiler aufgebaut ist und wie dessen Arbeitsabläufe aussehen.

C programmieren: Arrays, Pointer, Records und Typdefinitionen

C programmieren: Arrays, Pointer, Records und Typdefinitionen

27.07.18 - Ohne Datentypen funktioniert in C nichts. Elemente wie Arrays und Zeiger bzw Pointer oder Strukturen zählen zu den wichtigsten Bausteinen der Programmiersprache. Zum Abschluss der syntaktischen Elemente von C wollen wir daher auf diese Dateitypen näher eingehen - und auch den Präprozessor zur Code-Vorverarbeitung kurz erklären. lesen

C programmieren: Datentypen, Deklarationen, Operatoren und Ausdrücke

C programmieren: Datentypen, Deklarationen, Operatoren und Ausdrücke

13.07.18 - Die Syntax einer Programmiersprache stellt so etwas wie ihre Grammatik dar: Erst, wenn die lexikalischen Elemente beim Programmieren in C syntaktisch korrekt verwendet werden, können sinnvolle Anweisungen entstehen. Dieser Artikel beschreibt, wie die Syntax von C aufgebaut ist: Von Datentypen, Deklarationen, Operatoren bis hin zu Ausdrücken und Anweisungen. lesen

C programmieren: Kontrollstrukturen und Funktionen in C

C programmieren: Kontrollstrukturen und Funktionen in C

20.07.18 - Die Syntax der Programmiersprache C ist mächtig, birgt aber auch einige Tücken. Wie soll ein in C geschriebenes Programm ablaufen und wie führe ich gezielt Funktionen in C aus? Dieser Artikel geht näher auf diese syntaktischen Elemente ein. lesen

Hinweise: Dieser Beitrag, mit Ausnahme des letzten Absatzes, ist Copyright © Bernd Rosenlechner 2007-2010. Dieser Text kann frei kopiert und weitergegeben werden unter der Lizenz Creative Commons – Namensnennung – Weitergabe unter gleichen Bedingungen (CC – BY – SA) Deutschland 2.0.

Dieser Beitrag findet sich zudem im Handbuch „Embedded Systems Engineering“ im Kapitel "Einführung in die Sprache C". Das Handbuch ist auch als kostenlose PDF-Version in voller Länge auf ELEKTRONIKPRAXIS.de verfügbar.

* Prof. Dr. Christian Siemers lehrt an der Technische Universität Clausthal und arbeitet dort am Institut für Elektrische Informationstechnik (IEI).

Kommentar zu diesem Artikel abgeben

Schreiben Sie uns hier Ihre Meinung ...
(nicht registrierter User)

Zur Wahrung unserer Interessen speichern wir zusätzlich zu den o.g. Informationen die IP-Adresse. Dies dient ausschließlich dem Zweck, dass Sie als Urheber des Kommentars identifiziert werden können. Rechtliche Grundlage ist die Wahrung berechtigter Interessen gem. Art 6 Abs 1 lit. f) DSGVO.
Kommentar abschicken
copyright

Dieser Beitrag ist urheberrechtlich geschützt. Sie wollen ihn für Ihre Zwecke verwenden? Kontaktieren Sie uns über: support.vogel.de/ (ID: 45404615 / Embedded Programmiersprachen)