header
-
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 sollstmpl_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

-
Nexus schrieb:
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

Project->Porject Properties->Configurations Properites->C/C++->General und dann in Additional Directories die Pfade angeben.
Naja. Das machst du bestimmt auch oft, wenn du mal ne lib benutzen willst, da kommst du um diese Methode nicht rum die Header bekannt zu machen.

-
Ich inkludiere eigentlich immer die gleichen Verzeichnisse (ich wechsle meine Bibliotheken nicht häufig, bzw. benutze auch nicht viele verschiedene) und diese habe ich unter Extras -> Optionen -> Projekte und Projektmappen -> VC++-Verzeichnisse eingebunden.
