Header
Einer der offensichtlichsten Unterschiede zwischen C# und C++ und einer der Punkte, die häufig zum Schluss führen, dass C++ kompliziert sei, ist die Aufteilung des Codes in Header- und Source-Dateien. Was auf den ersten Blick tatsächlich nach viel unnötiger Arbeit ausschaut ist eigentlich eine ganz nützliche Sache. Sicherlich geht es auch anders, wie C# (und andere Sprachen) bereits bewiesen haben, aber nur weil es anders geht, heisst ja nicht, dass anders automatisch die bessere Lösung ist.
Zunächst muss ich ein klein wenig ausholen, damit sichergestellt ist, dass wir alle das gleiche Grundverständnis haben. Der Kompiliervorgang bei einem C++-Programm besteht aus drei für uns interessanten Schritten:
1. Preprocessor 2. Compiling 3. Linking
Der Preprocessor oder auch Präprozessor verarbeitet zunächst alle Preprocessor-Direktiven. Das sind Befehle, die mit einem # (Hash) anfangen. Dies ist auch in C# so. Für uns ist jedoch im Zusammenhang mit Headern die Include-Direktive (#include) am interessantesten. Was der Include-Befehl macht ist sehr einfach zu erklären. Er bindet eine andere Datei ein. Wer weis was dahintersteckt kommt damit ganz gut klar, da dies eine gute Beschreibung ist, trotzdem ist es manchmal vielleicht ein wenig kompliziert zu verstehen, daher möchte ich das etwas plakativer darstellen:
Der Preprocessor geht alle Dateien eines C++-Projektes durch und sucht nach Direktiven die mit einem # beginnen. Trifft er dabei auf #include so öffnet der Preprocessor diese Datei und ersetzt die Zeile in der sich die #include-Direktive befindet durch den gesamten Inhalt dieser Datei. Im Grunde genommen also ein Copy&Paste-Vorgang.
Damit kommen wir auch direkt zu einem wichtigen Punkt: Header-Dateien werden nicht kompiliert. Sie werden eingebunden und dann gemeinsam mit der Source-Datei vom Compiler kompiliert, das ist ein kleiner, aber feiner Unterschied.
Header-Dateien enthalten Definitionen, eine Art Bauplan des Source-Codes und beschreiben damit das, was sich in der eigentlichen Source-Datei befindet. Weiterhin können in Header-Dateien weitere Header-Dateien eingebunden werden, wenn der eigentliche Source-Code Teile aus anderen Dateien benötigt.
Header-Dateien werden bei einer API (z.B. in Form einer statischen Library) in Textform weitergegeben, der Source-Code kann unter Verschluß bleiben. Es reicht eine kompilierte Library, die dann vom Linker an das eigene Programm gebunden wird. Die Header-Datei enthält auch hierbei die Informationen, was sich im Source befindet (z.B. Klassen- und Methodendefinitionen).