verzeichnis - include header in header c++




Was ist der Unterschied zwischen#include<filename> und#include "filename"? (20)

In den C- und C ++ - Programmiersprachen, was ist der Unterschied zwischen der Verwendung von spitzen Klammern und der Verwendung von Anführungszeichen in einer include Anweisung, wie folgt?

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

the " < filename > " searches in standard C library locations

whereas "filename" searches in the current directory as well.

Ideally, you would use <...> for standard C libraries and "..." for libraries that you write and are present in the current directory.


#include <filename>

wird verwendet, wenn Sie die Header-Datei des C / C ++ - Systems oder der Compiler-Bibliotheken verwenden möchten. Diese Bibliotheken können stdio.h, string.h, math.h usw. sein.

#include "path-to-file/filename"

wird verwendet, wenn Sie Ihre eigene benutzerdefinierte Header-Datei verwenden möchten, die sich in Ihrem Projektordner oder an einem anderen Ort befindet.

Weitere Informationen zu Präprozessoren und Header. Lesen Sie C - Präprozessoren .


Das Include <file> weist den Präprozessor an, zuerst in -I Verzeichnissen und in vordefinierten Verzeichnissen zu suchen und dann im Verzeichnis der .c-Datei. Das Include "file" weist den Präprozessor an, zuerst das Verzeichnis der Quelldatei zu durchsuchen und 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 implementierungsdefinierten Positionen nach einem Header, der durch die angegebene Sequenz eindeutig zwischen den Begrenzern <und> definiert ist, 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.

3 Eine Vorverarbeitungsanweisung des Formulars

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

bewirkt die Ersetzung dieser Anweisung durch den gesamten Inhalt der Quelldatei, die durch die angegebene Sequenz zwischen den "Trennzeichen" identifiziert wird. Die benannte Quelldatei wird in einer implementierungsdefinierten Weise gesucht. Wenn diese Suche nicht unterstützt wird oder die Suche fehlschlägt Die Richtlinie wird so aufbereitet, als ob sie gelesen würde

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

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

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


Der #include <filename> wird verwendet, wenn auf eine Systemdatei verwiesen wird. Das ist eine Header-Datei, die an Standard-Systemstandorten wie /usr/include oder /usr/local/include . Für Ihre eigenen Dateien, die in einem anderen Programm enthalten sein müssen, müssen Sie die Syntax #include "filename" .


Die einfache allgemeine Regel besteht darin, spitze Klammern zu verwenden, um Header-Dateien einzuschließen, die mit dem Compiler geliefert werden. Verwenden Sie doppelte Anführungszeichen, um andere Headerdateien einzuschließen. Die meisten Compiler machen es so.

1.9 - Header-Dateien erklären ausführlicher die Präprozessor-Anweisungen. Wenn Sie ein Anfänger Programmierer sind, sollte diese Seite Ihnen helfen, all das zu verstehen. Ich habe es von hier gelernt, und ich habe es bei der Arbeit verfolgt.


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

In der C-Norm Abschnitt 6.10.2 heißt es in den Absätzen 2 bis 4:

  • Eine Vorverarbeitungsanweisung des Formulars

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

    Durchsucht eine Folge von implementierungsdefinierten Positionen nach einem Header, der durch die angegebene Sequenz eindeutig zwischen den Begrenzern < und > , 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 die Ersetzung dieser Anweisung durch den gesamten Inhalt der Quelldatei, die durch die angegebene Sequenz zwischen den " Trennzeichen " identifiziert wird. Die benannte Quelldatei wird in einer implementierungsdefinierten Weise gesucht. Wenn diese Suche nicht unterstützt wird oder wenn die Suche fehlschlägt Die Richtlinie wird so aufbereitet, als ob sie gelesen würde

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

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

  • 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 verarbeitet. (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. Das Verfahren, mit dem eine Folge von Vorverarbeitungstoken zwischen einem < und einem > Vorverarbeitungstokenpaar oder ein Paar von " Zeichen " zu einem einzigen Vornametokenvorverarbeitungstoken kombiniert wird, 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 "


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

Laut der Open Group Base Spezifikationen Ausgabe 7 ,

-I Verzeichnis

Ändern Sie den Algorithmus für die Suche nach Headern, deren Namen keine absoluten Pfadnamen sind, in das Verzeichnis, das durch den Verzeichnispfadnamen benannt wird, bevor Sie an den üblichen Stellen suchen. Daher müssen Header, deren Namen in Anführungszeichen ("") eingeschlossen sind, zuerst im Verzeichnis der Datei mit der Zeile #include gesucht werden, dann in Verzeichnissen, die in -I Optionen benannt sind, und zuletzt an den üblichen Stellen. Bei Kopfzeilen, deren Namen in spitze Klammern eingeschlossen sind ("<>"), darf die Kopfzeile nur in Verzeichnissen gesucht werden, die in -I Optionen und dann an den üblichen Stellen benannt sind. In -I- Optionen benannte Verzeichnisse müssen in der angegebenen Reihenfolge durchsucht werden. Implementierungen müssen mindestens zehn Instanzen dieser Option in einem einzelnen c99- Befehlsaufruf unterstützen.

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


Es tut:

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

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

und

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

Wenn ./ in <default_include_paths> , macht das keinen Unterschied.

Wenn sich mypath/myfile in einem anderen Include-Verzeichnis befindet, ist das Verhalten nicht definiert.


Für #include "Dateiname" sucht der Präprozessor im selben Verzeichnis wie die Datei, die die Direktive enthält. Diese Methode wird normalerweise verwendet, um vom Programmierer definierte Header-Dateien einzuschließen.

Für # enthält der Präprozessor Suchen in einer implementierungsabhängigen Weise, normalerweise in Suchverzeichnissen, die vom Compiler / IDE vorher festgelegt wurden. This method is normally used to include standard library header files.


Für #include "" durchsucht ein Compiler normalerweise den Ordner der Datei, die diesen Include und dann die anderen Ordner enthält. Für #include <> durchsucht der Compiler den Ordner der aktuellen Datei nicht.


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

Für #include <filename> sucht der Präprozessor 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.

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

Eine ausführlichere Beschreibung finden Sie in der GCC- Dokumentation zu Suchpfaden .


Nach dem Standard - ja, sie sind anders:

  • Eine Vorverarbeitungsanweisung des Formulars

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

    Durchsucht eine Folge von implementierungsdefinierten Positionen nach einem Header, der durch die angegebene Sequenz eindeutig zwischen den Begrenzern < und > , 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 die Ersetzung dieser Anweisung durch den gesamten Inhalt der Quelldatei, die durch die angegebene Sequenz zwischen den " Trennzeichen " identifiziert wird. Die benannte Quelldatei wird in einer implementierungsdefinierten Weise gesucht. Wenn diese Suche nicht unterstützt wird oder die Suche fehlschlägt Die Richtlinie wird so aufbereitet, als ob sie gelesen würde

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

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

  • 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 verarbeitet. (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. Das Verfahren, mit dem eine Folge von Vorverarbeitungstoken zwischen einem < und einem > Vorverarbeitungstokenpaar oder ein Paar von " Zeichen " zu einem einzigen Vornametokenvorverarbeitungstoken kombiniert wird, 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 "

Beachten Sie, dass der Standard keine Beziehung zwischen den implementierungsdefinierten Sitten angibt. Die erste Form sucht in einer implementierungsdefinierten Weise und die andere in einer (möglicherweise anderen) implementierungsdefinierten Weise. Der Standard gibt außerdem an, dass bestimmte Include-Dateien vorhanden sein müssen (z. B. <stdio.h> ).

Formal müssten Sie das Handbuch für Ihren Compiler lesen, aber normalerweise (traditionsgemäß) durchsucht das #include "..." Formular das Verzeichnis der Datei, in der #include zuerst gefunden wurde, und dann die Verzeichnisse, in denen #include <...> Formularsuchen (der Include-Pfad, zB System-Header).


Zumindest für die GCC-Version <= 3.0 erzeugt das Winkelklammerformular keine Abhängigkeit zwischen der enthaltenen Datei und der einschließenden Datei.

Wenn Sie also Abhängigkeitsregeln generieren möchten (z. B. mit der Option GCC-M), müssen Sie das in Anführungszeichen gesetzte Formular für die Dateien verwenden, die in der Abhängigkeitsstruktur enthalten sein sollen.

(Siehe http://gcc.gnu.org/onlinedocs/cpp/Invocation.html )


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

Sowohl die Benutzer- als auch die Systemheaderdateien werden mit der Vorverarbeitungsdirektive '#include' eingebunden. 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 mit der Option -I (siehe Invocation ) dieser Liste voranstellen.

#include "file"

Diese Variante wird für Header-Dateien Ihres eigenen Programms verwendet. Es sucht zuerst in dem Verzeichnis, das die aktuelle Datei enthält, nach einer Datei mit dem Namen datei, dann in den Zitatverzeichnissen und dann nach den gleichen Verzeichnissen, die für <file> . Mit der Option -iquote können Sie Verzeichnisse der Liste der -iquote voranstellen. Das Argument von '#include' , ob mit Begrenzungszeichen oder spitzen Klammern getrennt, verhält sich wie eine Zeichenkettenkonstante, da Kommentare nicht erkannt werden und Makronamen nicht erweitert werden. Daher gibt #include <x/*y> die Einbindung 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. Daher gibt #include "x\n\\y" einen Dateinamen mit drei umgekehrten Schrägstrichen an. (Einige Systeme interpretieren '\' als Trennzeichen für Pfadnamen. Alle interpretieren auch '/' dieselbe Weise. Es ist am tragbarsten, nur '/' .)

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


#include <filename>

will find the corresponding file from the C++ library. it means if you have a file called hello.h in the C++ library folder, #include <hello.h> will load it.

Aber,

#include "filename"

will find the file in the same directory where your source file is.

In addition,

#include "path_to_file/filename"

will find the file in the directory which you typed in path_to_file .


The order of search header files is different. <XXX.h> prefer to search the standard headers first while "XXX.h" searches the workspace's header files first.


When you use #include <filename>, the pre-processor looking for the file in directtory of C\C++ header files (stdio.h\cstdio, string, vector, etc.). But, when you use #include "filename": first, the pre-processor looking for the file in the current directory, and if it doesn't here - he looking for it in the directory of C\C++ header files.


  #include <filename>   (1)     
  #include "filename"   (2)

#include enthält die Quelldatei, die durch den Dateinamen identifiziert wird, in die aktuelle Quelldatei in der Zeile unmittelbar nach der Anweisung.

Die erste Version der Direktive durchsucht nur Standard-Include-Verzeichnisse. Die Standard-C ++ - Bibliothek sowie die Standard-C-Bibliothek sind implizit in Standard-Include-Verzeichnissen enthalten. Die Standard-Include-Verzeichnisse können vom Benutzer über Compiler-Optionen gesteuert werden.

Die zweite Version durchsucht zuerst das Verzeichnis, in dem sich die aktuelle Datei befindet, und durchsucht nur die Standard-Include-Verzeichnisse, wenn die Datei nicht gefunden wird.

Falls die Datei nicht gefunden wird, ist das Programm schlecht formatiert.


#include <abc.h>

wird verwendet, um Standardbibliotheksdateien einzuschließen. Der Compiler wird also die Speicherorte der Header der Standardbibliothek einchecken.

#include "xyz.h"

sagt dem Compiler, dass er benutzerdefinierte Header-Dateien enthalten soll. Der Compiler sucht also nach diesen Header-Dateien im aktuellen Ordner oder den angegebenen Ordnern.


  • #include <> ist für vordefinierte Header-Dateien

Wenn die Header-Datei vordefiniert ist, würden Sie einfach den Namen der Header-Datei in eckige Klammern schreiben und es würde so aussehen (vorausgesetzt, wir haben einen vordefinierten Header-Dateinamen namens iostream):

#include <iostream>
  • #include " " ist für Header-Dateien, die der Programmierer definiert

Wenn Sie (der Programmierer) Ihre eigene Header-Datei geschrieben haben, würden Sie den Header-Dateinamen in Anführungszeichen schreiben. Angenommen, Sie haben eine Header-Datei mit dem Namen myfile.h , dann ist dies ein Beispiel dafür, wie Sie die include-Anweisung verwenden würden, um diese Datei myfile.h :

#include "myfile.h"






c-preprocessor