Hallo Vitali,
Zuerst einmal musst du verstehen, dss dr Preprocesor eigentlich ein Textprocessor ist und eigentlich nichts mit der Programmiersprache C/C++ zu tun hat.
Er sucht nach Schlüsselwärtern welche mit „#“ anfangen und führt diese aus.
Dabai macht er eigentlich nichts, was mit Cut&:stuck_out_tongue_winking_eye:aste nicht auch getan werden könnte.
„#include“ setzt einach nur den Textas der angegebenen Datei an dieser STelle im Source-Code ein.
- Welchen Vorteil bringt es die Funktionsdeklaration in eine
*.h-Datei auszulagern?
Das merkst du erst dann, wenn du ein grösseres Projek, bzw Bibliotheken hast.
Du hast z.B. in einem Modul die Funktion „void f(int i)“. Um diese aus aderen Modulen aufrufen zu können, musst du diese in jedem Modul decklarieren, mit „void f(int i);“. Die deklaration braucht der Compiler um die Aufrufparamter prüfen zu können, auch weren vom Compiler automatisch die Typenconvertierungen vorgenommen.
Jetzt musst du „void f( int i)“ ind „void f( long i)“ ändern.
Ist kein Problem, die Typenconvertierung von int in long kann der Compiler automatisch machen.
Bei Verwendung einer .h musst du genau 2 Stellen ändern, einmal im Code, bei der Definition der Funktion, und einmal in der .h.
Adernfalls musst du alle Dateien durchsuchen …
Mit eine .h macht man eine Art Modul-Kapselung. Alles Aufrufe, Konstanten und Datentypen, welche für die Verwendung benötigt werden, pakt man in eine.h, diese wird auch im Modul mit eingebunden, damit alle Deklarationen nur einmal getippt werden müssen. Zudem hat man dann auch durch den Compiler einr Prüfung auf Konsistenz.
- Welchen Unterschied gibt es zwischen der Auslagerung einer
Funktion in eine *.h- und *.cpp-Datei? Wie ich verstehe ist
beides möglich.
Das ist eigentlich nur eine Konvention, du kannst technisch auch eine .xx-Datei vewenden.
In einer .h befinden sich Deklarationen, Konstanten usw.
In einer .c oder .cpp befindet sich Code.
- Wenn ich in einer ausgelagerten Funktion z.B. „cout“
verwende, so muss ich in diese Datei auch „IOSTREAM“ einbinden
und ggf. den Namensbereich mit „using namespace“ festlegen?
Verwende ich nun in der Hauptdatei auch „cout“, so muss ich
auch hier „IOSTREAM“ einbinden und ggf. den Namensbereich mit
„using namespace“ festlegen?
Lässt sich diese Redundanz vermeiden?
Nein.
C/C++ hat eigentlich einen ganz kleinen Funktionsumfang.
z.B. ist printf() gar nicht ein Bestandteil von C/C++ snder Teil einer, genormten, Bibliothek.
Dies hat den Vorteil, dass, im Prinzip, jeder seine eigene printf() schreiben kann, ohne, wenner sich an die Aufrufkonventionen hält, am restlichen Code etwas änden zu müssen.
Bei z.B. BASIC ist „PRINT“ und bei Pascal „WRITE“, sind dies Bestanteile der Sprache und es gibt keine Möglichkeit a diesen Funktionen etwas zu verändern. Bei Pascal kommt noch erschewrend hinzu, dass WRITE eine inkonsistenz der Sprache hat: variable Parateranzahln, sind in Standard-Pascal gar nicht möglich, aber WRITE kennt sie.
Vieles wird sich dir noch nicht erschliessen, wenn du aber ma in den Bereich kommst, wo deine Programme einige 1’000 Codezeilen erreichen oder überschreiten, wirst du die Module brauchen und schätzen lernen oder kläglich untergehen!
So lange du ein Betriebssystm verwendet, wirst du auch nie in die Verlegenheit kommen printf() selber schreiben zu müssen. Aber wenn du Programme für einen Microcontroller ohne Betriebssystem schreiben musst, sieht es anders aus.
Noch lustiger wird es, enn Programmteile auf einem PC und auf eiem Microcontroller benötogt werde, wi z.B. bei einem Übertragungsprotokoll.
MfG Peter(TOO)