C-Programmierung: Eigene Header

Aus Wikibooks

Wechseln zu: Navigation, Suche
Qsicon Ueberarbeiten.svg Dieser Artikel oder Abschnitt bedarf einer Überarbeitung. Näheres ist auf der Diskussionsseite angegeben. Hilf mit, ihn zu verbessern, und entferne anschließend diese Markierung.

Selbst erstellte Header sind sinnvoll, um ein Programm in Teilmodule zu zerlegen oder bei Funktionen und Konstanten, die in mehreren Programmen verwendet werden sollen. Eine Headerdatei – kurz: Header – hat die Form myheader.h. Sie enthält die Funktionsprototypen und Definitionen, die mit diesem Header in das Programm eingefügt werden.

  1. #ifndef myheader_h
    
  2. #define myheader_h
    
  3.  
    
  4. extern int myheaderVar1 = 2009;
    
  5. extern int myheaderVar2 = 2010;
    
  6.  
    
  7. int myheaderFunc1( )
    
  8. {
    
  9. 	printf( "Das ist die erste externe Funktion\n" );
    
  10. 	return 0;
    
  11. }
    
  12.  
    
  13. int myheaderFunc2( )
    
  14. {
    
  15. 	printf( "Das ist die zweite externe Funktion\n" );
    
  16. 	return 0;
    
  17. }
    
  18.  
    
  19. #endif
    

Anmerkung: Die Präprozessor-Direktiven #ifndef, #define und #endif werden detailliert im Kapitel Präprozessor erklärt.

In der ersten Zeile dieses kleinen Beispiels überprüft der Präprozessor, ob im Kontext des Programms das Makro myheader_h schon definiert ist. Wenn ja, ist auch der Header dem Programm schon bekannt und wird nicht weiter abgearbeitet. Dies ist nötig, weil es auch vorkommen kann, dass ein Header die Funktionalität eines andern braucht und diesen mit einbindet, oder weil im Header Definitionen wie Typdefinitionen mit typedef stehen, die bei Mehrfach-Includes zu Compilerfehlern führen würden.

Wenn das Makro myheader_h dem Präprozessor noch nicht bekannt ist, dann beginnt er ab der zweiten Zeile mit der Abarbeitung der Direktiven im if-Block. Die zweite Zeile gibt dem Präprozessor die Anweisung, das Makro myheader_h zu definieren. Damit wird gemerkt, dass dieser Header schon eingebunden wurde. Dieser Makroname ist frei wählbar, muss im Projekt jedoch eindeutig sein. Es hat sich die Konvention etabliert, den Namen dieses Makros zur Verbesserung der Lesbarkeit an den Dateinamen des Headers anzulehnen und ihn als myheader_h oder __myheader_h__ zu wählen. Dann wird der Code von Zeile 3 bis 17 in die Quelldatei, welche die #include-Direktive enthält, eingefügt. Zeile 19 kommt bei jeder Headerdatei immer am Schluss und teilt dem Präprozessor das Ende des if-Zweigs mit. Das wird noch genauer im Kapitel Der Präprozessor erklärt.

Variablen allgemein verfügbar machen stellt ein besonderes Problem dar, das besonders für Anfänger schwer verständlich ist. Grundsätzlich sollte man den Variablen in Header-Dateien das Schlüsselwort extern voranstellen. Damit weiss der Compiler, dass die Variablen myheaderVar1 und myheaderVar2 existieren, diese jedoch an anderer Stelle definiert sind. Würde eine Variable in einer Header-Datei definiert werden, würde für jede C-Datei, die die Header-Datei einbindet, eine eigene Variable mit eigenem Speicher erstellt. Jede C-Datei hat also ein eigenes Exemplar, ohne dass sich deren Bearbeitung auf die Variablen, die die anderen C-Dateien kennen, auswirkt. Eine Verwendung solcher Variablen sollte vermieden werden, denn das dient vor allem in der hardwarenahen Programmierung der Resourcenschonung. Stattdessen sollte man Funktionen der Art int getMeineVariable() benutzen.

Nachdem die Headerdatei geschrieben wurde, ist es noch nötig, eine C-Datei myheader.c zu schreiben. In dieser Datei werden die in den Headerzeilen 7 und 13 deklarierten Funktionen implementiert. Damit der Compiler weiß, dass diese Datei die Funktionalität des Headers ausprägt, wird als erstes der Header inkludiert; danach werden einfach wie gewohnt die Funktionen geschrieben.

  1. #include <stdio.h>
    
  2. #include "myheader.h"
    
  3.  
    
  4. int main ( void )
    
  5. {
    
  6. 	printf( "Wir haben das Jahr %d \n", myheaderVar1 );
    
  7. 	printf( "Treffen wir uns %d wieder\n", myheaderVar2 );
    
  8. 	myheaderFunc1( );
    
  9. 	myheaderFunc2( );
    
  10. 	return 0;
    
  11. }
    


Ergenis:
 
Wir haben das Jahr 2009 
Treffen wir uns 2010 wieder
Das ist die erste externe Funktion
Das ist die zweite externe Funktion

Die Datei myheader.c wird jetzt kompiliert und eine so genannte Objektdatei erzeugt. Diese hat typischerweise die Form myheader.obj oder myheader.o. Zuletzt muss dem eigentlichen Programm die Funktionalität des Headers bekannt gemacht werden, wie es durch ein #include "myheader.h" geschieht, und dem Linker muss beim Erstellen des Programms gesagt werden, dass er die Objektdatei myheader.obj bzw. myheader.o mit einbinden soll.

Damit der im Header verwiesenen Variable auch eine real existierende gegenübersteht, muss in myheader.c eine Variable vom selben Typ und mit demselben Namen deklariert werden.

Persönliche Werkzeuge