Code in C++ auslagern?

4 Antworten

Der Grundgedanke ist: Die Header-Datei definiert das Interface, die Source-Datei liefert die Implementierung.

Das ermöglicht es, das Interface zu nutzen, ohne die Implementierung zu kennen und zu haben. Zudem verhindert es, dass Implementierungen mehrfach bei der Verlinkung vorhanden sind (das wäre ein Problem, wenn man Source-Files inkludiert, dass die dann teilweise mehrfach auftauchen).

Es gibt allerdings Sachen, die schon zur Compile-Zeit bekannt sein müssen und nicht erst zur Link-Zeit. Das wären beispielsweise Template-Definitionen. Diese müssen entsprechend in Header-Dateien liegen.

Wenn Du Source-Dateien schreibst, so solltest zu jeder Source-Datei eine dazugehörige .h-Datei erstellen. Diese Datei enthält die "Vordefinitionen" der in der Source-Datei definiterten Funktionen. Willst Du Funktionen aus einer anderen Sourcedatei an anderer Stelle nutzen, so ist die passende Include-Datei dort am Anfang einzulesen.

Wie ein Projekt dann aus mehreren Source-Dateien zusammengesetzt wird, das passiert im Linker. Es muss also auch noch eine Datei für den Linker da sein, damit der weiß, was er zusammenlinken soll.

Ist vielleicht nicht ganz einfach zu erklären, ich versuche es mal:

In C++ müssen Funktionen bekannt sein, bevor sie genutzt werden. Dafür ist die Vorwärtsdeklaration. Das hat historische Gründe, bei Python durchsucht der Interpreter/Compiler einfach alle Dateien, um zu schauen ob (und wo) eine Funktion existiert. Dies spart sich der C++ Compiler im ersten Schritt.

Die Header-Datei ist dafür vorgesehen, um den Compiler zu sagen, welche Funktionen es (irgendwo im Projekt) gibt.

Kompiliert werden die cpp-Dateien. Zu jeder cpp-Datei wird eine Binärdatei (.o-Dateien) erstellt. Anschließend werden die Binärdateien miteinander verknüpft (gelinkt) und ein fertiges Programm daraus erstellt.

Ein "include" in einer cpp-Datei kopiert alles aus der entsprechenden Datei an die Stelle des include. Erst diese temporäre Datei wird dann kompiliert. Wenn du also eine komplette Funktion im include stehen hast, wird diese in jede Binärdatei separat aufgenommen.

Es funktioniert, ist aber nicht so sinnvoll/effizient. Besser ist es, wenn sie nur an einer Stelle ist.

In der Welt der C++-Programmierung ist es üblich, Funktionen und Klassen in separate Dateien auszulagern, um den Code übersichtlicher und wartungsfreundlicher zu gestalten. Diese Trennung erfolgt üblicherweise durch das Platzieren von Funktions- und Klassendeklarationen in Header-Dateien (

.h

oder

.hpp

) und die Implementierung in separaten Quelldateien (

.cpp

).

Die Verwendung von Header-Dateien ermöglicht eine klare Definition der Schnittstellen von Funktionen und Klassen, während die Implementierungsdetails in den Quelldateien verborgen bleiben. Dies fördert die Modularität des Codes und erleichtert es anderen Entwicklern, den Code zu verstehen und zu verwenden.

Darüber hinaus hilft die Trennung von Deklaration und Implementierung dabei, Mehrfachdefinitionen zu vermeiden und die Kompilierzeit zu optimieren. Änderungen an einer Quelldatei erfordern nur die Neukompilierung dieser Datei und der davon abhängigen Dateien, was den Build-Prozess beschleunigt.

Obwohl es für kleine Projekte ausreichen kann, Funktionen nur in Header-Dateien zu deklarieren und in einer einzigen Quelldatei zu implementieren, wird dringend empfohlen, die Praxis der Trennung von Deklaration und Implementierung zu erlernen und anzuwenden, insbesondere für größere Projekte oder Projekte, an denen mehrere Entwickler beteiligt sind. Dies trägt dazu bei, den Code besser zu strukturieren, die Wartbarkeit zu verbessern und das Risiko von Fehlern zu verringern.

Woher ich das weiß:Hobby