Header-Dateien



  • durchsucht der linker alle *.obj - dateien?
    oder wie?

    übrigens:...

    mein compiler und mein linker schrieb:

    ---------- BCC 32 (konsole) ----------
    Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
    blabla\test.cpp:
    Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
    Error: Unresolved external 'doFoo()' referenced from blabla\TEST.OBJ
    Normal Termination
    Output completed (0 sec consumed).



  • Ich kenne den BCB nicht so gut, aber Du musst dem Compiler natürlich alle .cpp-Dateien ansagen; bei g++ würde das zB so funktionieren:

    g++ -o programmname main.cpp foo.cpp
    


  • der Linker sollte in der Tat in den obj-Dateien die Funktion finden, egal in welcher .cpp-Datei diese Funktion definiert wurde. Dies ist grundsätzlich so, man muß dazu in diesem Fall nichts tun. Wenn es trotzdem bei dir nicht so funktioniert, dann stimmt etwas mit deiner Programmier-Umgebung nicht, oder du hast vergessen, auch die .cpp-Datei zu kompilieren, in der die Funktion liegt, und dann gibt es keine obj-Datei mittels deren Hilfe der Linker die Funktion auflösen kann. Vergleiche hierzu bei Borland:

    http://community.borland.com/article/0,1410,20997,00.html

    ganz unten siehst du an einem analogen Beispiel mit zwei .cpp-Dateien, daß das grundsätzlich funktionieren muß, wenn alles korrekt eingerichtet und aufgerufen wird.

    MfG



  • Hallöle...
    danke ersmal für eure Antworten, (👍)
    aber warum muss ich...

    #ifndef FOO_HPP
    #define FOO_HPP
    

    und...

    #endif
    

    in der Header Datei schreiben und was bedeuten/bewirken sie???
    Ich kapier das einfach nicht! Kann mir jemand helfen, please.

    MFG
    euer zocker001 😉



  • Der Compiler kommt ein bisschen durcheinander, wenn er eine Header Datei mehrfach einbindet. Er kann dann nicht mehr eindeutig zuordnen.
    Beim erstenmal FOO_HPP noch nicht definiert, also definiert er es
    'ifn(ot)def(ine)'. Beim Zweitenmal findet er die Definition FOO_HPP, geht deswegen nicht in die 'if' und inkludiert die Headerdatei nicht nochmal.
    'endif' schließt das 'if' nur ab.
    Das erspart dir viele Probleme und Fehlermeldungen.
    mfg
    arni



  • 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
    -usw

    Macht 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
    -usw

    Hast 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.


Anmelden zum Antworten