Aufteilung des Codes auf mehrere Dateien
-
Hi,
ich denke ich bin inzwischen in C++ ganz fit. Ich habe auch schon ein größeres Projekt mitbearbeitet, nur war da die Aufteilung schon vorgegeben.Wie macht man das richtig?
Man trennt ja anscheined gerne die Deklaration und die Definition von Funktionen. So wird die Deklaration in einem Header-File gemacht, die Definition dann in einem cpp-File.
Soweit so gut. Ich sitze hier aber gerade vor einem reinen C-Projekt wo das nicht getan wurde. Trotzdem kann ich im Main-File auf Funktionen der anderen Dateien zugreifen.

Warum geht das? Oder überseh ich was?
Mfg Mo3bius
-
Stehen die Deklarationen vielleicht im main-file?
Ansonsten stehen irgendwo garantiert Deklarationen, da das ganz sonst nicht kompiliert werden könnte, da der Compiler ja nicht weiß dass es diese Funktion gibt, die dort aufgerufen werden soll.Aber gehört eigentlich denk ich sowieso ins C-Forum

Lg freeG
-
-
@fr33g: Ja stimmt, die Deklarationen stehen wirklich im Main-File. Mir ist das anfangs nicht so aufgefallen, da im Mainfile nur einige wenige Funktionen deklariert werden. Diese beinhalten aber jede Menge andere Funktionen. Es scheint also zu genügen, wenn man einmal in einem anderen File ist. Dann kann man von dieser Funktion andere Funktionen in dem File ausführen.
@krümelkacker: Der Link war hilfreich, danke! Trotzdem verstehe ich eine Sache noch nicht ganz. Wenn ich (in C++) ein Headerfile einbinde, sagen wir class.h, wie weis der Compiler dann, dass er die Funktionen, Klassen dann in class.cpp findet?
Das mag jetzt eine doofe Frage sein, aber ich möchte das halt einmal richtig verstehen.
Mfg Mo3bius
-
indem man bei der .cpp die Header included

-
Ah ok, hab mich schon gewundert warum der header dort auch eingebunden ist.

Mfg Mo3bius
-
Mo3bius schrieb:
Wenn ich (in C++) ein Headerfile einbinde, sagen wir class.h, wie weis der Compiler dann, dass er die Funktionen, Klassen dann in class.cpp findet?
Das mag jetzt eine doofe Frage sein, aber ich möchte das halt einmal richtig verstehen.
Ich verstehe Dein Problem eventuell nicht ganz. Meinst Du viellecht folgendes...
class.h
#ifndef HELLO_H_INCLUDED #define HELLO_H_INCLUDED class hello { public: void greet() const; }; #endifclass.cpp
#include <iostream> #include "class.h" void hello::greet() const { std::cout << "Hello!\n"; }main.cpp
#include "class.h" int main() { hello x; x.greet(); return 0; }...woher der Compiler dann beim Übersetzen von main.cpp weiß, dass die Funktion hello::greet in hello.cpp definiert wird? Wenn das Deine Frage ist, dann ist die Antwort: Das muss der Compiler gar nicht wissen. Das ist Sache des Linkers. Du kannst alle cpp-Dateien einzeln übersetzen und die Resultate später mit dem Linker verbinden. Das ist ja gerade der Witz an der Sache. Beim Übersetzen von main.cpp wird nur die Datei main.cpp, class.h und iostream gelesen (eventuell noch andere, die von iostream eingebunden werden). Sonst muss der Compiler nichts weiter wissen -- auch nicht, wo hello::greet definiert wurde. Deswegen heißt das Konzept ja auch "getrennte Übersetzung".
-
Finn schrieb:
indem man bei der .cpp die Header included

Irgendwie passt deine Antwort glaub ich nicht so ganz auf die Frage

Was hat dass damit zu tun, woher der Compiler weiß wenn in der main ein Aufruf einer Funktion ist, dass diese in einer anderen Übersetzungsheinheit definiert ist?
Rein gar nichts
Denn der Compiler muss gar nicht wissen wo die Funktion definiert wird, er braucht nur eine Deklaration der Funktion, der Rest ist Aufgabe des Linkers.
Lg freeG
Edit:
Oh sorry da war ich wohl n Tick zu lange beim Post erstellen:D, krümelkacker war da wohl schneller :p
-
Ich glaub jetzt habe ich das verstanden. Vielen Dank für die Nachhilfe.

Mfg Mo3bius