8.6    Eigene Header erstellen

Wenn Ihre Programme umfangreicher werden, bzw. Sie in einem Team arbeiten, sollten Sie den Quellcode in verschiedene sinnvolle Module zerlegen. In der Praxis teilt man hierbei häufig ein Projekt in eine Quell- und eine Header-Datei ein, wodurch diese Module in mehreren Programmen verwendet werden können. In einem Header werden für gewöhnlich die Funktionsdeklarationen (Prototypen), globale Variablendeklaration (wenn unbedingt nötig), Konstanten und eigene Typdefinitionen notiert.

Eine einfache Header-Datei könnte demnach wie folgt aussehen:

00  // Kapitel8/modulA.h
01 #ifndef MODULA_H
02 #define MODULA_H

03 #define PI 3.14159265359
04 extern int modulA_var;
05 double kreisflaeche(double);

06 #endif /* MODULA_H */

In Zeile (01) prüfen Sie, ob dem Präprozessor bereits die Direktive MODULA_H bekannt ist. Ist dies nicht der Fall, definieren Sie diese Direktive in Zeile (02), um so ein mehrfaches Inkludieren zu vermeiden. Der Name einer Direktive ist frei wählbar, muss aber im gesamten Projekt eindeutig sein. Ansonsten finden Sie hier noch die Konstante PI, und es werden eine globale Variable und ein Funktionsprototyp deklariert.

Wenn Sie eine Header-Datei geschrieben haben, wird in der Regel auch eine entsprechende C-Quelldatei dazu erstellt, die den Header inkludiert und u. a. auch die Definitionen der Funktionsprototypen enthält. In dem letzten einfachen Beispiel sieht die C-Quelldatei wie folgt aus:

00  // Kapitel8/modulA.c
01 #include "modulA.h"
02 #include <stdio.h>

03 int modulA_var = 1234;

04 double kreisflaeche(double r) {
05 return PI * r * r;
06 }

In der Praxis wird diese C-Quelldatei häufig gar nicht mit ausgeliefert und lediglich zusammen mit der Header-Datei kompiliert (ohne den Linkerlauf). Auf diese Weise wird eine Objektdatei erzeugt, häufig in der Form modulA.obj oder modulA.o. Um die Funktionalitäten der Module in einem Programm zu verwenden, reicht es daher aus, wenn die Header-Datei und die Objektdatei ausgeliefert und verwendet werden. Damit ersparen Sie es sich, jedes Mal das komplette Projekt mit allen einzelnen Dateien zu kompilieren.

Um nun auch die Funktionalitäten der Header-Datei in der Praxis zu testen, müssen Sie sie nur an der entsprechenden Stelle im Projekt einfügen und die Funktionen verwenden. Hierzu noch ein Beispiel, das das kleine Beispielmodul in der Praxis nutzt:

00  // Kapitel8/test_beispielmodul.c
01 #include <stdio.h>
02 #include <stdlib.h>
03 #include "modulA.h"

04 int main(void) {
05 double dval = kreisflaeche(5.5);
06 printf("Kreisflaeche : %lf\n", dval);
07 printf("Wert von modulA_var : %d\n", modulA_var);
08 return EXIT_SUCCESS;
09 }

Beachten Sie beim Übersetzen von mehreren Modulen, dass Sie auch die entsprechenden C-Quelldateien mit angeben bzw. zum Projekt hinzugefügt haben.