Header-Dateien
-
Hääääää, ich verstehe nur Bahnhof
So wie ich das verstanden habe, überprüft der Compiler erstmal, ob FOO_HPP definiert ist. Dann wird wird der Inhalt von FOO_HPP zwischen #define FOO_HPP und #endif geschrieben, oder???
Sagt mir bitte, ob ich es richtig verstanden habe!!!
Übrigens: Warum muss man "HPP" an "FOO" anhängen??? Hat es eine spezielle Bedeutung???
MFG
euer zocker001
-
Hai Zocker,
ich fange mal unten an.Es ist deine Sache was du definierst, es muss halt nur eindeutig sein, und darf in einem Projekt halt nur in einer Headerdatei verwendet werden.
Du könntest genausogut 'FOO_BAHNHOF' benutzen. Im allgemeinen wird eine Konvention verwendet, die besagt, dass der Klassennamen verwendet wird, alles groß geschrieben und mit Unterstrich die Dateiextension angehängt wird. Der Vorteil bei der Verwendung des Klassennamens für die Definition liegt auf der Hand : er ist eindeutig.
Ansonsten hast du das glaube ich schon richtig verstanden. Es ist wie eine normale 'if', in diesem Fall nur eine spezielle Schreibweise für den Compiler.
Um genau zu sein, es entspricht eigentlich einer 'if(! ....)', weil es ist ja eine Frage, ob ein bestimmter Begriff nicht definiert wurde. In diesem Fall springt er in die 'ifndef' hinein definiert die Konstante ( Das isses letztendlich, wass du dann machst), und inkludiert das komplette Headerfile.Beim Übersetzen eines Programms geschieht folgendes: der Compiler startet vor der Übersetzung des Quelltextes in Objectcode den 'Präprozessor', der den Quelltext vorbearbeitet. Erfügt z.B. den Inhalt von Dateien in den QQuelltext ein, macht die Kompilierung von bestimmter Programmteile von einer Bedingung abhängig und einiges mehr. Du gibst ihm dazu sogenannte Direktiven, die alle mit dem Zeichen '#' beginnen. Erst nach dem Präprozessor Durchlauf startet das kompilieren, dabei werden die Objectdateien erstellt, die dann der Linker miteinander zum ausführbaren Programm verknüpft.
Such doch mal nach 'Präprozessor' oder 'Direktiven', hier im Forum oder in einem Grundlagenbuch, da findet sich bestimmt einiges.
mfg
arni
-
Besonderer Dank an "arni". Ich glaub, jetzt hab ich's besser verstanden. Nochmals vielen Dank, dass du dir Zeit genommen und dir Mühe gegeben hast, mir das genau zu erklären....
Natürlich auch ein Lob an die Anderen, die versucht haben, mir zu helfen.Spitze!
mfg,
euer zocker001
-
Also: Dieses komische zeug nennt sich include guard und bewirkt folgendes: Wenn du es weglässt, und die header mehrmals einbindest, passiert das: Der kompiler findet die Datei einmal und bindet sie ein, beim 2. mal auch,... Nun darf aber z.B. nur eine Funktion mit dem namen FOO und der Parameterliste (int) existieren! Also benutzt du den include guard, der dafür sorgt das alles so klappt wies soll! Noch ein Tipp: falls du anfänger bist: schreib es einfach so, du verstehst es später (glaub mir, ich spreche aus Erfahrung...) Und wenn du wirklich makros benutzen willst (wovon aber in den meisten Fällen abzuraten ist) sieht das z.B. so aus: (meine lieblingsmakro)
#define _string std::basic_string<TCHAR>
/edit: Wieder einer schneller...
-
Hallihallo...
Yo, ich bin Anfänger.
Das mit der Header-Datei-Geschichte hab ich im Großen ud Ganzen verstanden. Aber warum ist hier jeder gegen die Verwendung von Makros???
-
Hai Zocker
makros sind zb nicht Typsicher.,Der compiler kann dir bei nicht beabsichtigten Typkonvertierungen nicht helfen, den Fehler zu finden.
Beispiel#define MAX_USERS 42 const int MAX_USERS = 42;
unterscheidet sich dadurch, dass im zweiten FAll du u n d der Kompiler wissen, um welchen Datentyp es sich handelt.
Außerdem werden Makros immer genau so oft und genau dort, wo du sie im Code verwendet hast, eingefügt, so viel ich weiß, ist es dann auch mit Optimierungen an dieser Stelle Essig.
mfg
arni
-
Genauer: Wenn Du #defines verwendest dann sagst du im Grunde nur dem Präprozessor dass er vor dem eigentlichen Kompilieren eine reine Textersetzung vornehmen soll; warum das meistens schlecht ist kannst Du in jedem besseren C++-Buch nachlesen...
-
Danke......
ihr ratet mir also, lieber Variablen statt Makros zu verwenden. In meinem Buch werden allerdings keine negativen Bemerkungen angesprochen. Im Gegenteil:
-gute Lesbarkeit
-Änderungsfreundlichkeit
-uswMacht euch nichts draus. Ich folge besser eurem Rat....
Ciao
euer zocker001
-
zocker001 schrieb:
Danke......
ihr ratet mir also, lieber Variablen statt Makros zu verwenden. In meinem Buch werden allerdings keine negativen Bemerkungen angesprochen. Im Gegenteil:
-gute Lesbarkeit
-Änderungsfreundlichkeit
-uswHast Du ein C oder ein C++-Buch? Wenn C++ dann welches?
-
Ich habe ein C++ Buch mit dem Namen:
"C++ lernen und professionell anwenden"Ciao
euer zocker001
-
zocker001 schrieb:
Ich habe ein C++ Buch mit dem Namen:
"C++ lernen und professionell anwenden"Hm, seltsam, ich dachte das sei recht gut...
Naja, wenn Du ergänzende Literatur brauchst dann hol Dir einfach mal "Effektiv C++ programmieren", da wird auf derartige Do und DoNots eingegangen:
Effektiv C++ programmieren | ISBN: 3827313058
-
Hi,
das Buch "C++ lernen und professionell anwenden" ist schon gut, aber als totaler Anfänger begreife ich noch vieles nicht so genau (auch nach mehrmaligem Lesen). Wenn ich in manchen Dingen etwas unsicher bin, frage ich am besten bei euch nach oder hole mir nützliche Tipps und Ratschläge.
Hast du das Buch "C++ lernen und professionell anwenden" etwa auch???
Warst du damals auch ein Anfänger, wie ich es jetzt bin??? Hat das Buch dir geholfen???Also ich bin bis jetzt zufrieden, nur wenn man so ganz ins Detail geht, versteh ich halt gar nichts mehr...
Nützt mir das Buch "Effektik C++ programmieren" etwas, wenn ich noch ziemlich unerfahren im Umgang mit C++ bin???
Trotzdem, danke für den Kauftipp...
Ciao
euer zocker001
-
Nein, definitiv nicht. Mein vater hats im schrank und ich hab da mal reingeschaut das ist was für fortgeschrittene.