header



  • Hallo! kleine nachfrage:
    unter welchem typ speichert man programme, die als #include dateien eingebunden werden sollen? unter filename.h oder? wenn man sie dann einbinden will, muss man die datei doch in anführungsstrichelchen setzen oder?

    #include <conio> // C++ - Bibliothek
    #include "filename" // eigener header

    Danke im vorraus!



  • Hallo!

    Du kannst natürlich nicht nur headerdateien (.h) einbinden, sondern auch normale cppdateien 😉

    Und um diese Headerdatei einzubinden verwendest du (wie du ja selbst schon angedeutet hast) den include-befehl:

    #include "MeineHeaderdatei.h"
    

    Grüße
    Gapa



  • Grundsätzlich kannst du mit der Präprozessoranweisung "#include" jede Datei einbinden, deren Inhalt in Klartext dargestellt wird. Also normaler Text. Include-Anweisungen, die in eckigen Klammern stehen, also < und >, werden anhand der Umgebungsvariablen des Kompilers bzw. Präprozessors aufgelöst, da es "systemeigenes Header" sind. Wenn du eigene Header schreibst, z.B. meinheader.h, und du diesen mit

    #include "meinheader.h"
    

    einbindest, dann wird der Präprozessor die Datei "meinheader.h" innerhalb des Ordners suchen, in dem auch deine Hauptquelldatei liegt. Dabei muss der Name in der Include-Anweisung GENAU dem Namen deiner Datei, die du einbinden willst, entsprechen!



  • Berufspenner schrieb:

    dann wird der Präprozessor die Datei "meinheader.h" innerhalb des Ordners suchen, in dem auch deine Hauptquelldatei liegt.

    Und in jedem anderen Ordner, die dem Präprozessor als sogenannter "include-Pfad" angegeben worden ist.

    Was die Frage des OP angeht: Wie schon erwähnt wurde kannst du jede Klartext-Datei einbinden. Einige benennen z.B. ihre Headerdateien mit .hpp um den Unterschied zu C-Headern hervorzuheben, außerdem muss bei templates ja die komplette template-implementation mitgeliefert werden. Um dennoch bei templates den "heder" von der implementation zu trennen wird of nach der deklaration eine Datei mit der Implementation eingebunden.

    tmpl.h

    template <class T>
    void f(T const& t);  //nur Deklaration
    
    #include tmpl_impl.tmp //bloeder name, aber was solls
    

    tmpl_impl.tmp

    template <class T>
    void f(T const& t)
    {
      /* ... */
    }
    

    [/cpp]

    Man kann natürlich auch diverse andere Anwendungen von includes machen, wenn man im Hinterkopf hat, dass jede #include-Direktive schlicht durch den Text in der entsprechenden Datei ersetzt wird:

    const char* aussenDefiniertesArray[5] = {
    #include aussen.txt
    };
    

    ausse.txt

    "bla1",
    "blubb2",
    "solala",
    "4",
    "Nr5"
    

    wird dann zu:

    const char* aussenDefiniertesArray[5] = {
    "bla1",
    "blubb2",
    "solala",
    "4",
    "Nr5"
    };
    


  • wie legt man denn den ordner fest, indem gesucht wird?



  • @pumuckl! Ehm, das macht er aber nur, bei

    #include <meinheader.h>
    


  • BarnieGeroellheimer schrieb:

    @pumuckl! Ehm, das macht er aber nur, bei

    #include <meinheader.h>
    

    Wenn ich jetzt nicht grade ein Riesenbrett vorm Kopf habe macht er bei <> nur eine Suche in den Systemheader-Verzeichnissen - das ist was anderes als die include-Verzeichnisse (beim gcc z.B. mit -I übergeben)



  • Das ist meines Wissens nicht so. Bei <> sucht der Compiler in den angegebenen Suchpfaden, System wie auch Compiler (/I und INCLUDE), aber nicht im Verzeichnis der inkludierenden Datei (sofern nicht im Suchpfad). Bei "" sucht er wie bei <> und außerdem noch im Verzeichnis der Datei wo das include drin steht.
    [edit]
    Das ist alles implementation defined. Siehe Standard 16.2
    Microsoft macht es z.Bsp. so
    http://msdn.microsoft.com/en-us/library/36k2cdd4.aspx
    [edit]



  • Hallo,

    pumuckl schrieb:

    BarnieGeroellheimer schrieb:

    @pumuckl! Ehm, das macht er aber nur, bei

    #include <meinheader.h>
    

    Wenn ich jetzt nicht grade ein Riesenbrett vorm Kopf habe macht er bei <> nur eine Suche in den Systemheader-Verzeichnissen - das ist was anderes als die include-Verzeichnisse (beim gcc z.B. mit -I übergeben)

    Also der VC++-Compiler sucht in diesem Fall erst in allen Pfaden, die mit der /I-Option angegeben wurden, dann erst in mit der Umgebungsvariablen INCLUDE (nur wenn von der Kommandozeile kompiliert wird, wird diese überhaupt berücksichtigt) festgelegten Pfaden.

    MfG,

    Probe-Nutzer



  • ja, ok, ich versuchs ma 🙂 wie lange programmiert ihr schon?



  • BarnieGeroellheimer schrieb:

    @pumuckl! Ehm, das macht er aber nur, bei

    #include <meinheader.h>
    

    Ich wollts grad sagen. Mit "" sucht der Präprozessor nur im lokalen Verzeichnis und bei <> systemweit, halt in den Include-Pfande, die dem System bzw. dem Compiler bzw. dem Präprozessor bekannt sind.



  • joar, dem msvc is das fast egal...

    #include <asd>
    sucht zu erst in den standardordnern und danach in den selbst hinzugefügten

    #include "asd"
    macht es halt umgedreht...

    zumindest so weit ich das verstanden hatte ^^
    fest steht: wenn ein und die gleiche datei nicht in mehreren verschiedenen pfaden (in unterschiedlicher) ausführung existiert, dann ist es egal, was man schreibt ^^

    bb



  • #include schrieb:

    wie lange programmiert ihr schon?

    Ist das ein Kriterium für die Glaubwürdigkeit? 😉

    Also: Die Version mit < > sucht nur in den Include-Pfaden (Standard-Header befinden sich auch dort).
    Die Angabe per " " sucht zusätzlich noch im lokalen Ordner.



  • MSDN schrieb:

    Syntax Form:
    Quoted form
    Action:
    This form instructs the preprocessor to look for include files in the same directory of the file that contains the #include statement, and then in the directories of any files that include (#include) that file. The preprocessor then searches along the path specified by the /I compiler option, then along paths specified by the INCLUDE environment variable.

    Syntax Form:
    Angle-bracket form
    Action:
    This form instructs the preprocessor to search for include files first along the path specified by the /I compiler option, then, when compiling from the command line, along the path specified by the INCLUDE environment variable.

    obwohl mein englisch noch immer nicht das beste ist, glaube ich hier doch, recht zu haben ^^

    bb



  • obwohl mein englisch noch immer nicht das beste ist, glaube ich hier doch, recht zu haben

    Hast du auch. 😉



  • Okay, wenn du meinst... Probiers doch einfach mal aus, du wirst Dateien im selben Ordner (zumindest unter MSVC++ 2008 Express) nicht mit < > einbinden können.



  • Um hier einen Glaubenswettstreit vorzubeugen...ich vermute mal, dass die Vorgehensweise des Präprozessors eine Frage der Implementierung des Herstellers ist. Genau so, wie wir schon unterschiede bei Kompilern gewohnt sind 😉



  • Nexus schrieb:

    Probiers doch einfach mal aus, du wirst Dateien im selben Ordner nicht mit < > einbinden können.

    verdammt : <
    hast recht - hab zwar noch die 2005er (teamsuite-edition) aber die will das auch nicht machen : <

    naja - aber theoretisch hätte ich recht gehabt 😉 und man kann nun ma nich immer alles haben 😉



  • Nexus schrieb:

    Okay, wenn du meinst... Probiers doch einfach mal aus, du wirst Dateien im selben Ordner (zumindest unter MSVC++ 2008 Express) nicht mit < > einbinden können.

    Naja. Wenn du die IDE richtig einstellst schon. 😉



  • Keine Ahnung, aber ich bin eigentlich von Standardeinstellungen ausgegangen. Es ist ja nicht so, dass man zuerst die halbe IDE umkonfiguriert, um statt " " auch < > schreiben zu können 🙂


Anmelden zum Antworten