आपके कंपाइलर ने केवल नाम की फ़ाइल संकलित करने का प्रयास किया foo.cc
। लाइन नंबर मारने पर line
, संकलक पाता है:
#include "bar"
या
#include <bar>
कंपाइलर फिर उस फाइल को खोजने की कोशिश करता है। इसके लिए, यह देखने के लिए निर्देशिकाओं के एक सेट का उपयोग करता है, लेकिन इस सेट के भीतर, कोई फ़ाइल नहीं है bar
। शामिल विवरण के संस्करणों के बीच अंतर की व्याख्या के लिए यहां देखें ।
कंपाइलर को कैसे बताएं कि उसे कहां खोजना है
g++
एक विकल्प है -I
। यह आपको कमांड लाइन में खोज पथ शामिल करने देता है। कल्पना करें कि आपकी फ़ाइल bar
एक फ़ोल्डर में है जिसका नाम frobnicate
, सापेक्ष है foo.cc
(मान लें कि आप उस निर्देशिका से संकलित कर रहे हैं जहां foo.cc
स्थित है):
g++ -Ifrobnicate foo.cc
आप अधिक शामिल-पथ जोड़ सकते हैं; आपके द्वारा दिया गया प्रत्येक वर्तमान निर्देशिका के सापेक्ष है। Microsoft के कंपाइलर में एक सहसंबंधी विकल्प होता है /I
जो उसी तरह काम करता है, या विज़ुअल स्टूडियो में, कॉन्फ़िगरेशन गुण-> C / C ++ -> सामान्य-> अतिरिक्त शामिल निर्देशिकाएँ के तहत प्रोजेक्ट के प्रॉपर्टी पेज में फ़ोल्डर्स सेट किए जा सकते हैं।
अब कल्पना कीजिए कि आपके पास bar
विभिन्न फ़ोल्डरों के कई संस्करण दिए गए हैं:
#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"
सबसे बाईं ओर है:
$ g++ -IA -IB -IC foo.cc
$ ./a.out
A/bar
जैसा कि आप देख रहे हैं, जब संकलक ने देखना शुरू किया A/
, B/
और C/
, यह पहली या सबसे बाईं ओर रुका।
यह दोनों रूपों का सच है, include <>
और incude ""
।
#include <bar>
और के बीच अंतर#include "bar"
आमतौर पर, #include <xxx>
यह पहले सिस्टम फोल्डर में दिखता है , यह इसे पहले #include "xxx"
करंट या कस्टम फोल्डर में देखता है।
उदाहरण के लिए:
कल्पना करें कि आपके प्रोजेक्ट फ़ोल्डर में निम्नलिखित फाइलें हैं:
list
main.cc
साथ main.cc
:
#include "list"
....
इसके लिए, आपका कंपाइलर आपके प्रोजेक्ट फ़ोल्डर में #include
फ़ाइल करेगा list
, क्योंकि यह वर्तमान में संकलित है main.cc
और list
वर्तमान फ़ोल्डर में वह फ़ाइल है।
लेकिन इसके साथ main.cc
:
#include <list>
....
और फिर g++ main.cc
, आपका कंपाइलर सबसे पहले सिस्टम फोल्डर में दिखेगा, और क्योंकि <list>
यह एक मानक हेडर है, यह #include
फाइल का नाम होगा जो list
आपके सी ++ प्लेटफॉर्म के साथ मानक लाइब्रेरी के हिस्से के रूप में आता है।
यह सब थोड़ा सरल है, लेकिन आपको मूल विचार देना चाहिए।
<>
/ ""
-Pyerities और पर विवरण-I
Gcc-प्रलेखन के अनुसार , प्राथमिकता include <>
"सामान्य यूनिक्स प्रणाली" पर है, इस प्रकार है:
/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include
सी ++ कार्यक्रमों के लिए, यह पहले / usr / / / c ++ / संस्करण में भी दिखेगा। उपरोक्त में, लक्ष्य उस प्रणाली का विहित नाम है जिसे GCC कोड के लिए संकलित करने के लिए कॉन्फ़िगर किया गया था; [...]।
प्रलेखन में यह भी कहा गया है:
आप -Idir कमांड लाइन विकल्प के साथ इस सूची में जोड़ सकते हैं। डिफ़ॉल्ट निर्देशिकाओं से पहले , मैं -I द्वारा नामित सभी निर्देशिकाओं को बाएं से दाएं क्रम में खोजा जाता है । एकमात्र अपवाद तब होता है जब dir पहले से ही डिफ़ॉल्ट रूप से खोजा जाता है। इस स्थिति में, विकल्प को अनदेखा कर दिया जाता है और सिस्टम निर्देशिकाओं के लिए खोज क्रम अपरिवर्तित रहता है।
हमारे #include<list> / #include"list"
उदाहरण को जारी रखने के लिए (समान कोड):
g++ -I. main.cc
तथा
#include<list>
int main () { std::list<int> l; }
और वास्तव में, सिस्टम में -I.
फ़ोल्डर को प्राथमिकता दी जाती है .
और हमें एक कंपाइलर त्रुटि मिलती है।