Suchen

C programmieren: Präprozessor und Standardbibliothek

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

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.

Firmen zum Thema

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 )

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.

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).

(ID:45404615)