Frage Was ist der Unterschied zwischen #include und #include "filename"?


In den C- und C ++ - Programmiersprachen unterscheidet sich die Verwendung von spitzen Klammern und die Verwendung von Anführungszeichen in einem include Aussage, wie folgt?

  1. #include <filename> 
  2. #include "filename"

1809
2017-08-22 01:40


Ursprung


Antworten:


In der Praxis liegt der Unterschied an der Stelle, an der der Präprozessor nach der enthaltenen Datei sucht.

Zum #include <filename> Der Präprozessor sucht in einer implementierungsabhängigen Weise, normalerweise in Suchverzeichnissen, die vom Compiler / IDE vorher festgelegt wurden. Diese Methode wird normalerweise verwendet, um Header-Dateien der Standardbibliothek einzuschließen.

Zum #include "filename" Der Präprozessor sucht zuerst im selben Verzeichnis wie die Datei, die die Direktive enthält, und folgt dann dem Suchpfad, der für die #include <filename> bilden. Diese Methode wird normalerweise verwendet, um vom Programmierer definierte Header-Dateien einzuschließen.

Eine ausführlichere Beschreibung ist im GCC verfügbar Dokumentation zu Suchpfaden.


1045
2017-08-22 01:40



Die einzige Möglichkeit, dies zu wissen, ist das Lesen der Dokumentation Ihrer Implementierung.

Im der C-StandardIn Abschnitt 6.10.2 Absätze 2 bis 4 heißt es:

  • Eine Vorverarbeitungsanweisung des Formulars

    #include <h-char-sequence> new-line
    

    Durchsucht eine Sequenz von implementierungsdefinierten Stellen nach einem Header, der durch die angegebene Sequenz eindeutig identifiziert wird < und > Trennzeichen und bewirkt, dass diese Direktive durch den gesamten Inhalt des Headers ersetzt wird. Wie die Orte angegeben werden oder der Header identifiziert wird, ist implementierungsdefiniert.

  • Eine Vorverarbeitungsanweisung des Formulars

    #include "q-char-sequence" new-line
    

    bewirkt, dass diese Direktive durch den gesamten Inhalt der Quelldatei ersetzt wird, die durch die angegebene Sequenz zwischen den " Trennzeichen. Die benannte Quelldatei wird in einer implementierungsdefinierten Weise gesucht. Wenn diese Suche nicht unterstützt wird oder die Suche fehlschlägt, wird die Direktive so verarbeitet, als würde sie gelesen

    #include <h-char-sequence> new-line
    

    mit der identischen enthaltenen Sequenz (einschließlich > Zeichen, falls vorhanden) vom Original   Richtlinie.

  • Eine Vorverarbeitungsanweisung des Formulars

    #include pp-tokens new-line
    

    (Das entspricht keinem der beiden vorherigen Formulare) ist zulässig. Die Vorverarbeitungstoken nach include in der Direktive werden genauso wie im normalen Text bearbeitet. (Jeder Bezeichner, der aktuell als Makroname definiert ist, wird durch seine Ersetzungsliste von Vorverarbeitungstoken ersetzt.) Die nach allen Ersetzungen resultierende Anweisung muss mit einem der beiden vorherigen Formulare übereinstimmen. Die Methode, mit der eine Sequenz von Vorverarbeitungstoken zwischen a < und ein > Vorverarbeitungstokenpaar oder ein Paar von " Zeichen wird zu einem einzelnen Header-Namen kombiniert. Vorverarbeitungstoken ist implementierungsdefiniert.

Definitionen:

  • h-char: ein beliebiges Mitglied des Quellzeichensatzes außer dem Zeichen für die neue Zeile und >

  • q-char: ein beliebiges Mitglied des Quellzeichensatzes außer dem Zeichen für die neue Zeile und "


594
2017-09-16 21:06



Die Zeichenfolge zwischen <und> bezieht sich eindeutig auf eine Kopfzeile, bei der es sich nicht notwendigerweise um eine Datei handelt. Implementierungen sind ziemlich frei, die Zeichenfolge zu verwenden, wie sie möchten. (Meistens aber behandeln Sie es als einen Dateinamen und machen Sie eine Suche in der Pfad einschließen, wie die anderen Posts angeben.)

Wenn die #include "file" Wenn das Formular verwendet wird, sucht die Implementierung zuerst nach einer Datei mit dem angegebenen Namen, sofern sie unterstützt wird. Wenn nicht (unterstützt) oder wenn die Suche fehlschlägt, verhält sich die Implementierung wie die andere (#include <file>) Form wurde verwendet.

Auch eine dritte Form existiert und wird verwendet, wenn die #include Direktive entspricht keinem der obigen Formulare. In dieser Form wird einige grundlegende Vorverarbeitung (wie Makroexpansion) an den "Operanden" der #include Direktive, und das Ergebnis wird voraussichtlich mit einer der beiden anderen Formen übereinstimmen.


214
2017-09-08 17:43



Einige gute Antworten verweisen hier auf den C - Standard, haben aber den POSIX - Standard vergessen, insbesondere das spezifische Verhalten des c99 (z.B. C-Compiler) Befehl.

Gemäß Die Open Group Base Spezifikationen Ausgabe 7,

-ICH  Verzeichnis

Ändern Sie den Algorithmus für die Suche nach Headern, deren Namen keine absoluten Pfadnamen sind, in das Verzeichnis, das von der Verzeichnis Pfadname, bevor Sie an den üblichen Orten suchen. So müssen Header, deren Namen in Anführungszeichen ("") stehen, zuerst im Verzeichnis der Datei mit dem Suchbegriff gesucht werden #einschließen Zeile, dann in Verzeichnissen in -ICH Optionen und dauern an den üblichen Orten. Bei Kopfzeilen, deren Namen in spitze Klammern eingeschlossen sind ("<>"), wird nur in den Verzeichnissen nach in der Kopfzeile gesucht -ICH Optionen und dann an den üblichen Orten. Verzeichnisse in -ICH Optionen müssen in der angegebenen Reihenfolge gesucht werden. Implementierungen müssen mindestens zehn Instanzen dieser Option in einer einzigen unterstützen c99 Befehlsaufruf.

In einer POSIX-konformen Umgebung mit einem POSIX-kompatiblen C-Compiler #include "file.h" wird wahrscheinlich suchen ./file.h zuerst, wo . ist das Verzeichnis, in dem sich die Datei befindet #include Aussage, während #include <file.h>, wird wahrscheinlich suchen /usr/include/file.h zuerst, wo /usr/include ist Ihr System definiert übliche Orte für Header (es scheint nicht von POSIX definiert).


92
2017-07-20 09:29



Es tut:

"mypath/myfile" is short for ./mypath/myfile

mit . entweder das Verzeichnis der Datei, in der der #include ist enthalten in und / oder dem aktuellen Arbeitsverzeichnis des Compilers und / oder der default_include_paths

und

<mypath/myfile> is short for <defaultincludepaths>/mypath/myfile

Ob ./ ist in <default_include_paths>, dann macht es keinen Unterschied.

Ob mypath/myfile In einem anderen Include-Verzeichnis ist das Verhalten nicht definiert.


36
2018-02-08 11:45



GCC-Dokumentation sagt das Folgende über den Unterschied zwischen den beiden:

Sowohl die Benutzer- als auch die Systemheaderdateien werden mit der Direktive preprocessing eingebunden ‘#include’. Es hat zwei Varianten:

#include <file>

Diese Variante wird für Systemheaderdateien verwendet. Es sucht nach einer Datei namens Datei in einer Standardliste von Systemverzeichnissen. Sie können Verzeichnisse zu dieser Liste mit dem Präfix voranstellen -I Option (siehe Aufruf).

#include "file"

Diese Variante wird für Header-Dateien Ihres eigenen Programms verwendet. Es sucht nach einer Datei namens Datei zuerst in dem Verzeichnis, das die aktuelle Datei enthält, dann in den Zitatverzeichnissen und dann für dieselben Verzeichnisse <file>. Sie können der Liste der Angebotsverzeichnisse Verzeichnisse mit dem Präfix voranstellen -iquote Möglichkeit.     Das Argument von ‘#include’, ob durch Begrenzungszeichen oder spitze Klammern getrennt, verhält sich wie eine Zeichenkettenkonstante, da Kommentare nicht erkannt werden und Makronamen nicht erweitert werden. So, #include <x/*y> spezifiziert den Einschluss einer System-Header-Datei mit dem Namen x/*y.

Wenn Backslashes in der Datei auftreten, werden sie jedoch als normale Textzeichen und nicht als Escape-Zeichen betrachtet. Keine der Zeichenfolgenfolgen, die für Zeichenkettenkonstanten in C geeignet sind, wird verarbeitet. So,#include "x\n\\y"Gibt einen Dateinamen mit drei umgekehrten Schrägstrichen an. (Einige Systeme interpretieren '\' als Trennzeichen für Pfadnamen. Alle interpretieren auch ‘/’ in der gleichen Weise. Es ist am tragbarsten nur zu verwenden ‘/’.)

Es ist ein Fehler, wenn sich in der Zeile nach dem Dateinamen etwas anderes als Kommentare befindet.


30
2018-01-14 04:52



Das <file> include teilt dem Präprozessor mit, dass er suchen soll -I Verzeichnisse und in vordefinierten Verzeichnissen zuerst, dann im Verzeichnis der .c-Datei. Das "file" include teilt dem Präprozessor mit, das Verzeichnis der Quelldatei zu durchsuchen zuerst, und kehren Sie dann zu -I und vordefiniert. Alle Ziele werden trotzdem gesucht, nur die Reihenfolge der Suche ist unterschiedlich.

Der 2011-Standard behandelt hauptsächlich die Include-Dateien in "16.2 Quelldateieinschluss".

2 Eine Vorverarbeitungsanweisung des Formulars

# include <h-char-sequence> new-line

Durchsucht eine Folge von implementationsdefinierten Orten nach einem Header, der eindeutig von der   angegebene Sequenz zwischen den Trennzeichen <und> und bewirkt, dass   Ersetzen dieser Anweisung durch den gesamten Inhalt des Headers.   Wie die Orte angegeben werden oder der Header identifiziert wird   Implementierung definiert.

3 Eine Vorverarbeitungsanweisung des Formulars

# include "q-char-sequence" new-line

bewirkt, dass diese Direktive durch den gesamten Inhalt der Quelldatei ersetzt wird, die von der   spezifizierte Reihenfolge zwischen den "Trennzeichen. Die benannte Quelldatei ist   in einer implementierungsdefinierten Weise gesucht. Wenn diese Suche ist   nicht unterstützt, oder wenn die Suche fehlschlägt, wird die Direktive erneut verarbeitet   wenn es gelesen wird

# include <h-char-sequence> new-line

mit der identischen enthaltenen Sequenz (einschließlich> Zeichen, falls vorhanden) von der ursprünglichen Anweisung.

Beachten Sie, dass "xxx" Form degradiert zu <xxx> Formular, wenn die Datei nicht gefunden wird. Der Rest ist implementierungsdefiniert.


23
2017-09-03 12:17