Ihr Compiler hat gerade versucht, die genannte Datei zu kompilieren foo.cc
. Beim Erreichen der Zeilennummer line
findet der Compiler:
#include "bar"
oder
#include <bar>
Der Compiler versucht dann, diese Datei zu finden. Zu diesem Zweck werden eine Reihe von Verzeichnissen zum Durchsuchen verwendet, in dieser Gruppe befindet sich jedoch keine Datei bar
. Eine Erklärung des Unterschieds zwischen den Versionen der include-Anweisung finden Sie hier .
Wie man dem Compiler sagt, wo er es findet
g++
hat eine Option -I
. Sie können der Befehlszeile Include-Suchpfade hinzufügen. Stellen Sie sich vor , dass Ihre Datei bar
in einem Ordner mit dem Namen frobnicate
, bezogen auf foo.cc
(vorausgesetzt , dass Sie aus dem Verzeichnis kompilieren , wo foo.cc
befindet):
g++ -Ifrobnicate foo.cc
Sie können weitere Include-Pfade hinzufügen. Jedes von Ihnen angegebene ist relativ zum aktuellen Verzeichnis. Der Compiler von Microsoft verfügt über eine Korrelationsoption /I
, die auf die gleiche Weise funktioniert. In Visual Studio können die Ordner auf den Eigenschaftenseiten des Projekts unter Konfigurationseigenschaften-> C / C ++ -> Allgemein-> Zusätzliche Einschlussverzeichnisse festgelegt werden.
Stellen Sie sich nun vor, Sie haben mehrere Versionen bar
in verschiedenen Ordnern:
#include<string>
std::string which() { return "A/bar"; }
#include<string>
std::string which() { return "B/bar"; }
#include<string>
std::string which() { return "C/bar"; }
#include "bar"
#include <iostream>
int main () {
std::cout << which() << std::endl;
}
Die Priorität mit #include "bar"
ist ganz links:
$ g++ -IA -IB -IC foo.cc
$ ./a.out
A/bar
Wie Sie sehen, wenn der Compiler gestartet Suche durch A/
, B/
und C/
hielt es an dem ersten oder am weitesten links stehenden Hit.
Dies gilt für beide Formen include <>
und incude ""
.
Unterschied zwischen #include <bar>
und#include "bar"
Normalerweise #include <xxx>
werden zuerst Systemordner und zuerst #include "xxx"
aktuelle oder benutzerdefinierte Ordner angezeigt.
Z.B:
Stellen Sie sich vor, Sie haben die folgenden Dateien in Ihrem Projektordner:
list
main.cc
mit main.cc
:
#include "list"
....
Zu diesem Zweck erstellt Ihr Compiler #include
die Datei list
in Ihrem Projektordner, da sie derzeit kompiliert wird main.cc
und sich diese Datei list
im aktuellen Ordner befindet.
Aber mit main.cc
:
#include <list>
....
Anschließend g++ main.cc
überprüft Ihr Compiler zuerst die Systemordner. Da <list>
es sich um einen Standardheader handelt, wird #include
die Datei mit dem Namen verwendet list
, die mit Ihrer C ++ - Plattform als Teil der Standardbibliothek geliefert wird.
Dies ist alles etwas vereinfacht, sollte Ihnen aber die Grundidee geben.
Details zu <>
/ ""
-priorities und-I
Laut der gcc-Dokumentation hat include <>
auf einem "normalen Unix-System" folgende Priorität :
/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include
Bei C ++ - Programmen wird zuerst auch in / usr / include / c ++ / version nachgeschaut. Oben ist Ziel der kanonische Name des Systems, für das GCC zum Kompilieren von Code konfiguriert wurde. [...].
In der Dokumentation heißt es außerdem:
Sie können dieser Liste mit der Befehlszeilenoption -Idir hinzufügen. Alle mit -I benannten Verzeichnisse werden in der Reihenfolge von links nach rechts vor den Standardverzeichnissen durchsucht . Die einzige Ausnahme ist, wenn das Verzeichnis bereits standardmäßig durchsucht wird. In diesem Fall wird die Option ignoriert und die Suchreihenfolge für Systemverzeichnisse bleibt unverändert.
Um unser #include<list> / #include"list"
Beispiel fortzusetzen (gleicher Code):
g++ -I. main.cc
und
#include<list>
int main () { std::list<int> l; }
In der Tat enthält die -I.
Priorisierung des Ordners .
über das System und wir erhalten einen Compilerfehler.