Il tuo compilatore ha appena provato a compilare il file denominato foo.cc
. Dopo aver premuto il numero di riga line
, il compilatore trova:
#include "bar"
o
#include <bar>
Il compilatore quindi tenta di trovare quel file. Per questo, utilizza un set di directory in cui esaminare, ma all'interno di questo set non c'è alcun file bar
. Per una spiegazione della differenza tra le versioni dell'istruzione include guarda qui .
Come dire al compilatore dove trovarlo
g++
ha un'opzione -I
. Ti consente di aggiungere percorsi di ricerca di inclusione alla riga di comando. Immagina che il tuo file bar
si trovi in una cartella denominata frobnicate
, relativa a foo.cc
(supponi di compilare dalla directory in cui foo.cc
si trova):
g++ -Ifrobnicate foo.cc
Puoi aggiungere più percorsi di inclusione; ogni dato è relativo alla directory corrente. Il compilatore di Microsoft ha un'opzione di correlazione /I
che funziona allo stesso modo, oppure in Visual Studio le cartelle possono essere impostate nelle pagine delle proprietà del progetto, in Proprietà di configurazione-> C / C ++ -> Generale-> Directory di inclusione aggiuntive.
Ora immagina di avere più versioni di bar
in cartelle diverse, dato:
#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;
}
La priorità con #include "bar"
è quella più a sinistra:
$ g++ -IA -IB -IC foo.cc
$ ./a.out
A/bar
Come vedi, quando il compilatore ha iniziato a guardare A/
, B/
e C/
, si è fermato al primo o al colpo più a sinistra.
Questo è vero per entrambe le forme include <>
e incude ""
.
Differenza tra #include <bar>
e#include "bar"
Di solito, il file #include <xxx>
fa guardare prima nelle cartelle di sistema, poi lo #include "xxx"
fa guardare prima nelle cartelle correnti o personalizzate.
Per esempio:
Immagina di avere i seguenti file nella cartella del tuo progetto:
list
main.cc
con main.cc
:
#include "list"
....
Per questo, il tuo compilatore inserirà #include
il file list
nella cartella del tuo progetto, perché attualmente si compilamain.cc
e c'è quel file list
nella cartella corrente.
Ma con main.cc
:
#include <list>
....
quindi g++ main.cc
, il compilatore esaminerà prima le cartelle di sistema e, poiché <list>
è un'intestazione standard, lo farà#include
il file denominato list
fornito con la piattaforma C ++ come parte della libreria standard.
È tutto un po 'semplificato, ma dovrebbe darti l'idea di base.
Dettagli su <>
/ ""
-priorità e-I
Secondo la documentazione di gcc , la priorità include <>
è, su un "normale sistema Unix", la seguente:
/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include
Per i programmi C ++, cercherà prima anche in / usr / include / c ++ / version. In quanto sopra, target è il nome canonico del sistema per cui GCC è stato configurato per compilare il codice; [...].
La documentazione afferma inoltre:
È possibile aggiungere a questo elenco con l'opzione della riga di comando -Idir. Tutte le directory nominate da -I vengono cercate, in ordine da sinistra a destra, prima delle directory predefinite . L'unica eccezione è quando dir è già cercato per impostazione predefinita. In questo caso, l'opzione viene ignorata e l'ordine di ricerca per le directory di sistema rimane invariato.
Per continuare il nostro #include<list> / #include"list"
esempio (stesso codice):
g++ -I. main.cc
e
#include<list>
int main () { std::list<int> l; }
e in effetti, la -I.
priorità della cartella .
sul sistema include e otteniamo un errore del compilatore.