Video

Du möchtest wissen, was Module sind und wie man sie darstellt? Im folgenden Beitrag erklären wir dir die Modularisierung in C.

Inhaltsübersicht

Module C – Aufteilung des Quellcodes in Übersetzungseinheiten

Ganz ähnlich wie du dir, um einen Aufsatz zu schreiben, nicht einfach ein riesiges Blatt nimmst und dieses vollschreibst, können wir auch Quellcode auf verschiedene „Blätter“ aufteilen. Das macht vor allem bei größeren, komplexeren Programmen Sinn, da es die Navigation vereinfacht und es dir sogar ermöglichen kann, Teile deines Codes ohne viel extra Aufwand wieder verwenden zu können.

Module C
direkt ins Video springen
Modularisierung

Dazu müssen wir unseren Code in verschiedene, sogenannte „Übersetzungseinheiten“ aufteilen. Diese müssen alle selbstständig sein, aber nur eine pro Programm darf eine main-Funktion enthalten. Das klingt etwas kompliziert, ist es aber gar nicht. Im Prinzip kannst du dir die einzelnen Module vorstellen wie Puzzlestücke, die zusammengesetzt ein Bild ergeben. Jedes Puzzleteil kann für sich selbst existieren. Aber um einen Sinn zu ergeben, braucht es andere Teile.

C- und Header-Dateien

Alle diese Teile bestehen aus einer c-Datei und einer Dateiform, die wir noch nicht kennen – der Header-Datei. Dateien dieses Typs enthalten Makros, auch symbolische Konstanten genannt, und die Funktionsprototypen der, in der c – Datei definierten Funktionen. Das besondere Modul, das die main-Funktion enthält, nennt man Programmdatei.

Module C
direkt ins Video springen
Header- und C-Dateien

Womit wir uns jetzt noch beschäftigen, ist wie wir unsere fertigen Stücke zu einem Ganzen zusammensetzen. Das hängt zwar davon ab, welche Software du für das Programmieren verwendest, aber mit dem gcc Compiler, müssen alle Module mit zugehöriger header-Datei einzeln übersetzt werden. Dazu öffnen wir ganz einfach die Kommandozeile, beziehungsweise unser Terminal und geben folgenden Befehl ein:

gcc -c module.c

Das können wir mit beliebig vielen Modulen so machen und erhalten dabei o-Dateien. Sind wir damit fertig, kannst du auch schon alles zusammenfügen. Dazu benutzt du diesen Befehl:

gcc module.o module_2.c … main.c

Wir haben unser Programm. Wenn du eine Entwicklungsumgebung nutzt, wird sich diese wahrscheinlich um all das kümmern. Aber du solltest trotzdem wissen, wie der ganze Vorgang abläuft. Deswegen schauen wir ihn uns jetzt Stück für Stück an.

Studyflix vernetzt: Hier ein Video aus einem anderen Bereich

Module C: Ablauf des Prozesses

Als erstes kümmert sich der Präprozessor um unseren Quellcode einer Datei und wandelt ihn in erweiterten Quellcode um. Danach nimmt sich der Compiler selbst der Sache an und macht aus unserem erweiterten Quellcode Assemblercode. Dessen Namensvetter, der Assembler mischt sich daraufhin ein und konvertiert den Assembler-Code in Objektcode. Als letzte Partei kommt der Binder, auch Linker genannt, zum Zug. Er verbindet den Objektcode der einzelnen Übersetzungseinheiten, der Programmdatei und der Bibliotheksfunktionen zu lesbarem Maschinencode.

Module C
direkt ins Video springen
Ablauf des Prozesses

Wenn wir nun alle header-Dateien – da wo wir sie brauchen – eingebunden haben, sollte unser Programm ohne Probleme funktionieren.

Modularisierung — häufigste Fragen

(ausklappen)
  • Was bedeutet „modular“?
    „Modular“ bedeutet bei C, dass man ein Programm in mehrere getrennte Übersetzungseinheiten aufteilt, statt alles in eine Datei zu schreiben. Jede Einheit besteht typischerweise aus einer .c-Datei mit Implementierungen und einer Header-Datei mit Funktionsprototypen und Makros. Am Ende werden die Teile zusammen gelinkt.
  • Was ist ein Beispiel für ein Modul?
    Ein Beispiel für ein Modul ist ein Rechen-Modul mit rechen.c und rechen.h. In rechen.c steht die Funktionsdefinition, zum Beispiel int add(int a, int b) { return a + b; }. In rechen.h steht der passende Funktionsprototyp int add(int a, int b);, den man mit #include einbindet.
  • Welche Nachteile hat die modulare Bauweise?
    Nachteile der modularen Bauweise sind vor allem zusätzlicher Organisations- und Build-Aufwand. Man muss Header- und C-Dateien konsistent halten, Abhängigkeiten sauber einbinden und beim Übersetzen alle passenden Objektdateien erzeugen und beim Linken angeben. Sonst treten schneller Fehler auf, die in Ein-Datei-Programmen nicht vorkommen.
  • Warum bekommt man beim Linken undefined reference, obwohl man die Header-Datei eingebunden hat?
    Das Einbinden einer Header-Datei sorgt nicht dafür, dass der Linker den Code automatisch findet, weil ein Header nur Deklarationen enthält. „undefined reference“ entsteht, wenn die passende Implementierung nicht mitübersetzt oder die zugehörige Objektdatei nicht mitgelinkt wird. Auch ein anderer Funktionsname oder eine andere Signatur kann den Verweis brechen.

Nach Beantwortung speichern wir deine Antwort, um Studyflix zu verbessern. Mehr dazu erfährst du in unserer Datenschutzerklärung.

Programmieren verstehen

Modularisierung gehört zum Programmieren und ist ein wichtiger Teil beim Aufbau von C Programmen. Wer sich mit Programmieren beschäftigt, arbeitet mit Funktionen, Dateien und klaren Aufgaben im Code. Dabei wird verständlich, wie einzelne Teile zusammenpassen und wie aus mehreren Modulen ein lauffähiges Programm entsteht. Im Informatikbereich findest du passende Videos zu diesem und verwandten Themen.

Lernen lohnt sich! Entdecke hier deine Chancen.