Unterschied zwischen include.hpp und "include.hpp" [duplizieren]

8

Ich bin neu in C ++.

Was ist der Unterschied zwischen dem Einschließen der C ++ - Header-Dateien mit "" und "<& gt;"

?

Ich versuche, einige der Header-Dateien aus einer Open-Source-Bibliothek zu verwenden. Alle Header-Dateien in dieser Bibliothek sind mit & lt; & gt; enthalten. Jetzt, wenn ich das gleiche in meiner Header-Datei mache, scheitert es bei der Kompilierung.

    
M99 13.09.2011, 15:09
quelle

7 Antworten

15

& lt; & gt; sucht zunächst im Header-Pfad nach der Header-Datei, wobei "" zuerst im aktuellen Verzeichnis der Datei nach dem Header sucht.

    
DrYap 13.09.2011, 15:12
quelle
9

Die Unterscheidung ist sehr weitgehend Implementierung definiert; das "..." Formular sollte zuerst an der Stelle suchen, wo sich die Datei befindet, die es enthält gelegen; die <...> nein. Darüber hinaus sehen beide in einer Implementierung nach definierte Liste von Orten, mit der zusätzlichen Anforderung, dass, wenn die Compiler findet keine "..." -Form in irgendeinem der erwarteten Orte, es verarbeitet das Include erneut, als wäre es ein <...> form.

In der Praxis erstellen alle Compiler, die ich kenne, eine Liste von Orten mit die Optionen -I oder /I , gefolgt von einer Anzahl von "Standard" und Compiler definierte Orte. Diese Liste ist für <...> ; "..." wird gesucht im selben Verzeichnis wie die einschließende Datei, dann behandelt als <...> . (Zumindest einige Compiler haben auch Optionen, um sie der Liste hinzuzufügen "..." .)

Ich bin mir nicht sicher, was in Bezug auf die Bibliothek passiert. Normalerweise, Wenn Sie eine Bibliothek eines Drittanbieters verwenden, müssen Sie einen oder mehrere -I oder hinzufügen /I Optionen, um dem Compiler mitzuteilen, wo seine Header zu finden sind. Einmal Sie haben das getan, sowohl Ihr Code als auch der Bibliothekscode sollten alle finden die notwendigen Header. Den einen Fall kann ich mir vorstellen, wo ein include ist könnte in einem Bibliothekskopf und nicht in eigenen Kopfzeilen funktionieren, ist ein "..." style enthält einen Bibliothekskopf, der von enthalten ist einen anderen Bibliothekskopf, der einen Pfadspezifizierer verwendet, z.B.:

Bibliotheksdatei1.hpp:

%Vor%

LibraryFile2.hpp:

%Vor%

Sie haben dem Compiler gesagt, dass er nach den Kopfzeilen suchen soll (mit -I Option) in etwas wie LibraryRoot/include , wo ist LibraryFile1.hpp befindet sich; LibraryFile2.hpp ist relativ dazu location und in LibraryFile2.hpp findet der Compiler LibraryFile3.hpp , weil es sich im selben Verzeichnis wie die Datei befindet beinhaltet es. Wenn Sie versuchen, LibraryFile3.hpp direkt einzubinden, der Compiler wird es jedoch nicht finden.

    
James Kanze 13.09.2011 15:30
quelle
4

Die Datei includes zwischen <> wird im Pfad des Compilers gesucht, während "" relativ zu Ihrem aktuellen Verzeichnis aussieht (oder absolut, wenn Sie einen Pfad angeben, der mit / oder c:\ beginnt, aber nicht empfohlen)

Auf Unix-Systemen enthält der Pfad standardmäßig /usr/include . Dieser Pfad kann vervollständigt werden, indem -Isome_directory hinzugefügt wird, um darin zu suchen.

Wenn Sie beispielsweise Ihre Datei test.c haben und include/test.h einbeziehen möchten, haben Sie verschiedene Möglichkeiten:

  • Schreiben Sie #include "include/test.h" , was relativ aus dem Verzeichnis der kompilierten Datei aussieht.

  • Schreiben Sie #include <test.h> , aber dieses Mal müssen Sie -Iinclude für den Compiler angeben, um das Verzeichnis ./include zum Pfad des Compilers hinzuzufügen.

Beachten Sie jedoch, dass einige Compiler die "" -Notation für Suchvorgänge im Pfad akzeptieren, aber das hat mich immer verwirrt und ist eine schlechte Sache zu tun.

    
wormsparty 13.09.2011 15:19
quelle
2

Die Anführungszeichen beziehen sich auf den lokalen Ordner und die & lt; & gt; bedeutet, von einem anderen Verzeichnis, das mit einem Flag angegeben wurde, in g ++ oder MSVC oder einen anderen Compiler, den Sie verwenden, oder Systemkopfzeilen einzubeziehen.

    
Jesus Ramos 13.09.2011 15:11
quelle
2

& lt; & gt; sucht im Standardverzeichnis nach Include-Dateien, "" sucht im aktuellen Verzeichnis und dann im Standardverzeichnis nach

    
helium 13.09.2011 15:12
quelle
1

Diese Frage ist ein Duplikat von Frage 21593 . Keine der obigen Antworten ist völlig korrekt. Wie viele Programmierer habe ich die informelle Konvention verwendet, das Formular "myApp.hpp" für anwendungsspezifische Dateien und das Formular für Bibliotheks- und Compiler-Systemdateien zu verwenden, d. H. Die in / I angegebenen Dateien und die Umgebungsvariable INCLUDE. Der C-Standard gibt jedoch an, dass die Suchreihenfolge implementierungsspezifisch ist.

Hier ist die msdn Erklärung , die hier für Ihre Bequemlichkeit kopiert wurde.

  

Zitiertes Formular      Der Präprozessor sucht nach Include-Dateien in dieser Reihenfolge:
     1. In demselben Verzeichnis wie die Datei, die die # include-Anweisung enthält.
     2. In den Verzeichnissen der gerade geöffneten Include-Dateien, in umgekehrter Reihenfolge, in der
        Sie wurden geöffnet. Die Suche beginnt im Verzeichnis der übergeordneten Include-Datei und von
        geht weiter durch die Verzeichnisse aller Großeltern-Include-Dateien.
     3. Entlang dem Pfad, der von jeder Compileroption / I angegeben wird.
     4. Entlang der Pfade, die von der Umgebungsvariablen INCLUDE angegeben werden.

     

Winkelform
    Der Präprozessor sucht nach Include-Dateien in dieser Reihenfolge:
    1. Entlang des Pfades, der von jeder / I Compiler-Option angegeben wird.
    2. Wenn das Kompilieren in der Befehlszeile erfolgt, entlang der Pfade, die vom INCLUDE-Objekt angegeben werden        Umgebungsvariable.

    
riderBill 14.10.2014 23:13
quelle
0

Wenn Sie eine Datei mit <> einbinden, wird der Compiler angewiesen, in umgebungsdefinierten Einschlussordnern nach diesen Dateien zu suchen. Diese Ordner können Standard-Systemordner sein oder von Ihrem Makefile definiert werden, wenn Sie eines verwenden. Mit "" sucht der Compiler nur im Pfad der Quelldatei nach Include-Dateien.
Sie können also "" verwenden und absolute Pfade oder den relativen Pfad zu der Quelldatei verwenden, in die Sie sich einfügen möchten, oder Sie können <> nach dem Definieren Ihrer Einschlussordner verwenden und einfach den Namen der Headerdatei angeben enthalten.
IMHO, die zweite Option ist besser, vor allem, wenn Sie viele Header oder mehrere Bibliotheken usw. verwenden ...

Um Aufnahmeordner zum Zeitpunkt der Kompilierung zu definieren: gcc -I ... ( man gcc! ) )

    
psycho 13.09.2011 15:19
quelle

Tags und Links