Derleyiciniz adlı dosyayı derlemeye çalıştı foo.cc
. Satır numarasına line
ulaşıldığında derleyici şunları bulur:
#include "bar"
veya
#include <bar>
Derleyici daha sonra bu dosyayı bulmaya çalışır. Bunun için, bakmak için bir dizi dizin kullanır, ancak bu kümede dosya yoktur bar
. İnclude ifadesinin sürümleri arasındaki farkın açıklaması için buraya bakın .
Derleyiciye onu nerede bulacağını söyleme
g++
bir seçeneği var -I
. Komut satırına dahil arama yolları eklemenizi sağlar. Dosyanızın (bulunduğu dizinden derlediğinizi varsayın) şuna göre bar
adlı bir klasörde olduğunu hayal edin :frobnicate
foo.cc
foo.cc
g++ -Ifrobnicate foo.cc
Daha fazla içerme yolu ekleyebilirsiniz; verdiğiniz her biri o anki dizine bağlıdır. Microsoft'un derleyicisinin /I
aynı şekilde çalışan bir ilişkilendirme seçeneği vardır veya Visual Studio'da klasörler, Konfigürasyon Özellikleri-> C / C ++ -> Genel-> Ek Dahil Etme Dizinleri altında Projenin Özellik Sayfalarında ayarlanabilir.
Şimdi bar
, farklı klasörlerde birden çok sürümünüzün olduğunu düşünün :
#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;
}
#include "bar"
İle öncelik en soldadır:
$ g++ -IA -IB -IC foo.cc
$ ./a.out
A/bar
Gördüğünüz gibi, derleyici başladığında bakarak A/
, B/
ve C/
, ilk veya en soldaki hit durdu.
Bu her iki form için de geçerlidir include <>
ve incude ""
.
Fark arasında #include <bar>
ve#include "bar"
Genellikle, önce #include <xxx>
sistem klasörlerine #include "xxx"
bakmasını sağlar, önce geçerli veya özel klasörlere bakmasını sağlar.
Örneğin:
Proje klasörünüzde aşağıdaki dosyaların bulunduğunu hayal edin:
list
main.cc
ile main.cc
:
#include "list"
....
Bunun için derleyiciniz proje klasörünüzdeki #include
dosyayı olacaktır list
, çünkü şu anda derlenmektedir main.cc
ve bu dosya list
mevcut klasörde bulunmaktadır.
Ancak şu şekilde main.cc
:
#include <list>
....
ve daha sonra g++ main.cc
, derleyiciniz önce sistem klasörlerine bakacak ve <list>
standart bir başlık olduğu için , standart kitaplığın bir parçası olarak C ++ platformunuzla birlikte gelen #include
adlı dosya olacaktır list
.
Bunların hepsi biraz basitleştirilmiştir, ancak size temel fikri vermelidir.
İlgili ayrıntılar <>
/ ""
-priorities ve-I
Göre gcc-dokümantasyon için öncelik include <>
"normal Unix sisteminde" olduğundan, aşağıdaki gibi:
/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include
C ++ programları için, önce / usr / include / c ++ / version dizinine de bakacaktır. Yukarıda, hedef, GCC'nin kod derlemek için yapılandırıldığı sistemin kanonik adıdır; [...].
Belgelerde ayrıca şunlar belirtilmektedir:
-Idir komut satırı seçeneği ile bu listeye ekleyebilirsiniz. Varsayılan dizinlerden önce -I ile adlandırılan tüm dizinler soldan sağa sırayla aranır . Tek istisna, dir zaten varsayılan olarak aranmış olmasıdır. Bu durumda, seçenek göz ardı edilir ve sistem dizinleri için arama sırası değişmeden kalır.
#include<list> / #include"list"
Örneğimize devam etmek için (aynı kod):
g++ -I. main.cc
ve
#include<list>
int main () { std::list<int> l; }
ve gerçekten, sistem içerir ve -I.
klasöre öncelik verir .
ve derleyici hatası alırız.