Was ist der Unterschied zwischen #include und #include “Dateiname”?

Lesezeit: 9 Minuten

Was ist der Unterschied zwischen include und include Dateiname
Suche49

Was ist in den Programmiersprachen C und C++ der Unterschied zwischen der Verwendung von spitzen Klammern und der Verwendung von Anführungszeichen in einer include Aussage, wie folgt?

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

Was ist der Unterschied zwischen include und include Dateiname
piCookie

Die einzige Möglichkeit, dies herauszufinden, besteht darin, die Dokumentation Ihrer Implementierung zu lesen.

Im die C-NormAbschnitt 6.10.2, Absätze 2 bis 4 heißt es:

  • Eine Vorverarbeitungsanweisung des Formulars

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

    durchsucht eine Folge von implementierungsdefinierten Stellen nach a Header eindeutig identifiziert durch die angegebene Sequenz zwischen den < und > Trennzeichen und bewirkt, dass diese Direktive durch den gesamten Inhalt der ersetzt wird Header. Wie die Stellen angegeben oder der Header identifiziert werden, ist implementierungsdefiniert.

  • Eine Vorverarbeitungsanweisung des Formulars

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

    bewirkt die Ersetzung dieser Direktive durch den gesamten Inhalt der Quelldatei identifiziert durch die angegebene Sequenz zwischen den " Trennzeichen. Die benannte Quelldatei wird implementierungsdefiniert gesucht. Wenn diese Suche nicht unterstützt wird oder die Suche fehlschlägt, wird die Anweisung erneut verarbeitet, als ob sie gelesen worden wäre

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

    mit der identisch enthaltenen Sequenz (inkl > Zeichen, falls vorhanden) aus der ursprünglichen Anweisung.

  • Eine Vorverarbeitungsanweisung des Formulars

    #include pp-tokens new-line
    

    (das keiner der beiden vorherigen Formen entspricht) ist zulässig. Die Vorverarbeitungstoken danach include in der Direktive werden wie im normalen Text verarbeitet. (Jeder derzeit als Makroname definierte Bezeichner wird durch seine Ersetzungsliste von Vorverarbeitungstoken ersetzt.) Die Direktive, die sich nach allen Ersetzungen ergibt, muss mit einer der beiden vorherigen Formen übereinstimmen. Die Methode, mit der eine Folge von Vorverarbeitungstoken zwischen a < und ein > Vorverarbeitungstokenpaar oder ein Paar von " Zeichen werden zu einem einzelnen Header-Namen kombiniert. Das Vorverarbeitungstoken ist implementierungsdefiniert.

Definitionen:

  • h-char: jedes Mitglied des Quellzeichensatzes außer dem Zeilenumbruchzeichen und >

  • q-char: jedes Mitglied des Quellzeichensatzes außer dem Zeilenumbruchzeichen und "

  • Relevant: Umsetzung in g++ und in visuelles c++

    – Alexander Malachow

    10. Oktober 2012 um 3:48 Uhr

  • @piCookie sowohl als auch “filename” suchen nach implementierungsdefinierten Orten. Was ist also der Unterschied?

    – onmyway133

    4. Februar 2013 um 3:45 Uhr

  • @Stefan, ich zitiere nur den Standard, der nichts über INCLUDE_PATH aussagt. Ihre Implementierung kann dies tun, meine möglicherweise nicht. Die ursprüngliche Frage war generisch C und nicht speziell gcc (was meiner Meinung nach INCLUDE_PATH verwendet) oder Microsoft C (was meiner Meinung nach der Fall ist) oder irgendetwas anderes, daher kann es nicht generisch beantwortet werden, sondern es muss auf die Dokumentation jeder Implementierung verwiesen werden.

    – piCookie

    25. August 2013 um 0:22 Uhr

  • Wie bei all diesen Situationen sind konkrete Beispiele (insbesondere von häufigen Szenarien) sehr nützlich und werden gleichermaßen geschätzt. Unnötig stumpfe allgemeine Antworten haben nicht so viel praktischen Nutzen.

    – vargonisch

    29. April 2014 um 17:51 Uhr

  • “So kann der C-Standard ausführlich sein und Ihre Frage nicht beantworten”

    – anatolyg

    29. März 2015 um 19:32 Uhr

  • +1, das ist wahrscheinlich die prägnanteste und richtigeste Antwort hier. Nach dem Standard (den piCookie in seiner Antwort zitiert) ist die einzige Real Unterschied ist “Header” versus “Quelldatei”. Der Suchmechanismus ist so oder so implementierungsdefiniert. Die Verwendung von doppelten Anführungszeichen bedeutet, dass Sie beabsichtigen, eine “Quelldatei” einzufügen, während spitze Klammern bedeuten, dass Sie beabsichtigen, einen “Header” einzufügen, der, wie Sie sagen, möglicherweise überhaupt keine Datei ist.

    – Dan Formen

    17. August 2009 um 16:12 Uhr

  • Siehe Dan Mouldings Kommentar zur Antwort von quest49; Standardheader müssen nicht in Dateiform vorliegen, sie können eingebaut werden.

    – Aib

    27. Januar 2011 um 9:28 Uhr

  • Ich lese seit einem Jahrzehnt dieses “Standard-Header müssen nicht in Dateiform vorliegen”. Möchtest du ein Beispiel aus der Praxis geben?

    – Maxim Egorushkin

    8. Februar 2011 um 11:54 Uhr

  • @Maxim Yegorushkin: Mir fallen auch keine realen Beispiele ein; Für MS-DOS kann es jedoch keinen vollständigen C11-Compiler geben, es sei denn, Header müssen keine Dateien sein. Dies liegt daran, dass einige der C11-Headernamen nicht mit der MS-DOS-Dateinamenbeschränkung “8.3” kompatibel sind.

    – Dan Formen

    12. Oktober 2012 um 12:35 Uhr

  • @MaximEgorushkin: Der VAX/VMS C-Compiler behielt alle Header der C-Laufzeitbibliothek in einer einzigen Textbibliotheksdatei (ähnlich einem Unix-Archiv) und verwendete die Zeichenfolge zwischen den < und > als Schlüssel zum Indexieren in die Bibliothek.

    – Adrian McCarthy

    15. Februar 2017 um 23:14 Uhr

1647292814 812 Was ist der Unterschied zwischen include und include Dateiname
Yann Droneaud

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

Entsprechend The Open Group Base Specifications Ausgabe 7,

-ICH Verzeichnis

Ändern Sie den Algorithmus für die Suche nach Headern, deren Namen keine absoluten Pfadnamen sind, um in dem Verzeichnis zu suchen, das durch die benannt wird Verzeichnis pathname, bevor Sie an den üblichen Stellen suchen. Header, deren Namen in doppelte Anführungszeichen (“” ) eingeschlossen sind, sollen also zuerst im Verzeichnis der Datei mit dem gesucht werden #enthalten Zeile, dann in Verzeichnissen mit dem Namen in -ICH Optionen und zuletzt an den üblichen Stellen. Bei Headern, deren Namen in spitze Klammern (“<>” ) eingeschlossen sind, soll der Header nur in Verzeichnissen gesucht werden, die in benannt sind -ICH Optionen und dann an den üblichen Orten. Verzeichnisse benannt in -ICH Optionen werden in der angegebenen Reihenfolge durchsucht. Implementierungen müssen mindestens zehn Instanzen dieser Option in einer einzigen unterstützen c99 Befehlsaufruf.

In einer POSIX-kompatiblen 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 mit der befindet #include Aussage, während #include <file.h>wird wahrscheinlich suchen /usr/include/file.h zuerst, wo /usr/include ist Ihr System definiert üblichen Orten für Header (es scheint nicht von POSIX definiert zu sein).

  • Was ist die genaue Quelle des Textes? Ist es aus dem normativen Teil von IEEE Std 1003.1, 2013?

    – osgx

    12. März 2015 um 2:34 Uhr

  • @osgx: Diese Formulierung (oder etwas sehr Ähnliches) findet sich in der POSIX-Spezifikation für c99 — das ist der POSIX-Name für den C-Compiler. (Der POSIX 2008-Standard konnte sich kaum auf C11 beziehen; das Update von 2013 auf POSIX 2008 hat den C-Standard, auf den er sich bezieht, nicht geändert.)

    – Jonathan Leffler

    10. November 2016 um 3:40 Uhr

  • Das war auch mein erster Gedanke. Die Manpage für gcc enthält dies ebenso wie andere. Es gibt auch etwas Ähnliches für Bibliotheken – -L.

    – Pryftan

    21. November 2019 um 22:55 Uhr


Das genaue Verhalten des Präprozessors variiert zwischen den Compilern. Die folgende Antwort gilt für GCC und mehrere andere Compiler.

#include <file.h> weist den Compiler an, in seinem “includes”-Verzeichnis nach dem Header zu suchen, z. B. nach MinGW, nach dem der Compiler suchen würde file.h in C:\MinGW\include\ oder wo auch immer Ihr Compiler installiert ist.

#include "file" weist den Compiler an, das aktuelle Verzeichnis (dh das Verzeichnis, in dem sich die Quelldatei befindet) zu durchsuchen file.

Du kannst den … benutzen -I Flag für GCC, um ihm mitzuteilen, dass es, wenn es auf ein Include mit spitzen Klammern stößt, auch im Verzeichnis danach nach Headern suchen soll -I. GCC behandelt das Verzeichnis nach dem Flag so, als wäre es das includes Verzeichnis.

Wenn Sie beispielsweise eine Datei mit dem Namen myheader.h in Ihrem eigenen Verzeichnis, könnte man sagen #include <myheader.h> wenn Sie GCC mit der Flagge aufgerufen haben -I . (was angibt, dass im aktuellen Verzeichnis nach Includes gesucht werden soll.)

Ohne das -I Flagge, müssen Sie verwenden #include "myheader.h" um die Datei einzuschließen oder zu verschieben myheader.h zum include Verzeichnis Ihres Compilers.

  • Was ist die genaue Quelle des Textes? Ist es aus dem normativen Teil von IEEE Std 1003.1, 2013?

    – osgx

    12. März 2015 um 2:34 Uhr

  • @osgx: Diese Formulierung (oder etwas sehr Ähnliches) findet sich in der POSIX-Spezifikation für c99 — das ist der POSIX-Name für den C-Compiler. (Der POSIX 2008-Standard konnte sich kaum auf C11 beziehen; das Update von 2013 auf POSIX 2008 hat den C-Standard, auf den er sich bezieht, nicht geändert.)

    – Jonathan Leffler

    10. November 2016 um 3:40 Uhr

  • Das war auch mein erster Gedanke. Die Manpage für gcc enthält dies ebenso wie andere. Es gibt auch etwas Ähnliches für Bibliotheken – -L.

    – Pryftan

    21. November 2019 um 22:55 Uhr


1647292814 615 Was ist der Unterschied zwischen include und include Dateiname
Peter Mortensen

GCC-Dokumentation sagt Folgendes über den Unterschied zwischen den beiden:

Sowohl Benutzer- als auch System-Header-Dateien werden mithilfe der Vorverarbeitungsanweisung eingeschlossen ‘#include’. Es hat zwei Varianten:

#include <file>

Diese Variante wird für System-Header-Dateien verwendet. Es sucht nach einer Datei namens file in einer Standardliste von Systemverzeichnissen. Sie können dieser Liste Verzeichnisse mit voranstellen -I Möglichkeit (vgl Aufruf).

#include "file"

Diese Variante wird für Header-Dateien Ihres eigenen Programms verwendet. Es sucht nach einer Datei mit dem Namen Datei zuerst in dem Verzeichnis, das die aktuelle Datei enthält, dann in den Zitatverzeichnissen und dann in denselben Verzeichnissen, die für verwendet werden <file>. Sie können der Liste der Zitatverzeichnisse Verzeichnisse mit voranstellen -iquote Möglichkeit. Das Argument von ‘#include’, unabhängig davon, ob sie durch Anführungszeichen oder spitze Klammern begrenzt sind, verhält sich wie eine Zeichenfolgenkonstante, da Kommentare nicht erkannt und Makronamen nicht erweitert werden. Daher, #include <x/*y> gibt die Einbeziehung einer System-Header-Datei mit dem Namen an x/*y.

Wenn jedoch Backslashes in einer Datei vorkommen, werden sie als normale Textzeichen und nicht als Escape-Zeichen betrachtet. Keine der Escape-Zeichenfolgen, die für String-Konstanten in C geeignet sind, werden verarbeitet. Daher,#include "x\n\\y"gibt einen Dateinamen an, der drei umgekehrte Schrägstriche enthält. (Einige Systeme interpretieren ‘\’ als Trennzeichen für Pfadnamen. Alle diese interpretieren auch ‘/’ in der gleichen Weise. Es ist am tragbarsten, nur zu verwenden ‘/’.)

Es ist ein Fehler, wenn etwas (außer Kommentaren) in der Zeile nach dem Dateinamen steht.

  • Was ist ein „Zitatverzeichnis“?

    – Jack M

    30. Juli 2020 um 13:31 Uhr

  • @JackM • es gibt 3 Standorte: die #include-ing-Datei Aktuelles Verzeichnisder Verzeichnisse zitieren (die zu überprüfenden Pfade für die #include "foo.h" Stil umfasst) und die Systemverzeichnisse (die zu überprüfenden Pfade für die #include <bar.h> Stil beinhaltet).

    – Eljay

    2. August 2020 um 13:29 Uhr

  • Was bedeutet „System“ in dem Ausdruck „System-Header-Datei“? Ich finde, dass Informatiker viel mit diesem Wort “System” um sich werfen und ich oft nicht sagen kann, ob es “Betriebssystem”, “Computersystem” oder etwas anderes bedeutet.

    – wenigO

    15. November 2020 um 0:56 Uhr


  • Dies ist die beste Antwort. Dieses Thema kann jahrelang und jahrzehntelang endlos diskutiert werden, aber der klare Compiler-Trend ist, dass <> für Systemheader und ” ” für lokale Verzeichnis- und Projektheader steht. Ich verwende <> für Systemkopfzeilen und ” ” für alles andere. Auf diese Weise ist im Code klar, ob ein Header ein Systemheader ist. Außerdem müssen Sie auf diese Weise, wenn Sie lokale Projektheader beim Ändern des Codes in ein anderes Verzeichnis verschieben, ” ” nicht in <> ändern und umgekehrt. (PS: Dies ist auch die ReSharper C++-Methodik, die Header automatisch für Sie einschließt).

    Benutzer2534096

    17. September 2021 um 15:46 Uhr


  • Ich stimme zu, dass dies die beste Antwort ist. Zur Verdeutlichung, für mich ist eine Systemdatei alles, was Sie nicht geschrieben haben und auf das Sie verweisen, natürlich enthält Ihr Compiler, aber darüber hinaus alle anderen installierten Pakete. Und eine Programmdatei, die Sie geschrieben haben. Bei Verwendung von Google-Protobufs wäre eine Systemdatei und eine Programmdatei Ihr Protobuf “mydir/my_pb.h”.

    – Bill Gale

    7. Oktober 2021 um 21:38 Uhr

1003160cookie-checkWas ist der Unterschied zwischen #include und #include “Dateiname”?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy