c++ - #include<filename> और#include "फ़ाइल नाम" के बीच क्या अंतर है?




header-files c-preprocessor (20)

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 कथन में उद्धरणों का उपयोग करने के बीच क्या अंतर है?

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

#include <filename>

जब आप सी / सी ++ सिस्टम या कंपाइलर पुस्तकालयों की हेडर फ़ाइल का उपयोग करना चाहते हैं तो इसका उपयोग किया जाता है। ये पुस्तकालय stdio.h हो सकते हैं, string.h, math.h, आदि

#include "path-to-file/filename"

जब आप अपनी प्रोजेक्ट फ़ोल्डर में या कहीं और अपनी कस्टम हेडर फ़ाइल का उपयोग करना चाहते हैं तो इसका उपयोग किया जाता है।

प्रीप्रोसेसरों और हेडर के बारे में अधिक जानकारी के लिए। सी - प्रीप्रोसेसर पढ़ें।


<और> के बीच वर्णों का अनुक्रम विशिष्ट रूप से एक शीर्षलेख का संदर्भ देता है, जो आवश्यक रूप से एक फ़ाइल नहीं है। कार्यान्वयन चरित्र अनुक्रम का उपयोग करने के लिए बहुत अधिक स्वतंत्र हैं। (ज्यादातर, हालांकि, इसे सिर्फ फ़ाइल नाम के रूप में मानें और अन्य पोस्ट स्टेटस के रूप में पथ शामिल करने में एक खोज करें।)

यदि #include "file" फ़ॉर्म का उपयोग किया जाता है, तो कार्यान्वयन पहले समर्थित नाम की फ़ाइल को देखता है, यदि समर्थित हो। यदि नहीं (समर्थित), या यदि खोज विफल हो जाती है, तो कार्यान्वयन व्यवहार करता है जैसे कि अन्य ( #include <file> ) फ़ॉर्म का उपयोग किया गया था।

साथ ही, एक तिहाई रूप मौजूद है और इसका उपयोग तब किया जाता है जब #include निर्देश उपर्युक्त रूपों में से किसी एक से मेल नहीं खाता है। इस रूप में, कुछ बुनियादी प्रीप्रोकैसिंग (जैसे मैक्रो विस्तार) #include निर्देश के "संचालन" पर किया जाता है, और परिणाम दो अन्य रूपों में से एक से मेल खाने की उम्मीद है।


अभ्यास में, अंतर उस स्थान पर है जहां प्रीप्रोसेसर शामिल फ़ाइल की खोज करता है।

#include <filename> प्रीप्रोसेसर एक कार्यान्वयन पर निर्भर तरीके से खोज करता है, आमतौर पर संकलक / आईडीई द्वारा पूर्व-निर्धारित खोज निर्देशिकाओं में। यह विधि सामान्य रूप से मानक लाइब्रेरी हेडर फ़ाइलों को शामिल करने के लिए उपयोग की जाती है।

#include "filename" लिए प्रीप्रोसेसर पहले डायरेक्टिव वाली फ़ाइल के समान निर्देशिका में खोज करता है, और फिर #include <filename> फ़ॉर्म के लिए उपयोग किए गए खोज पथ का पालन करता है। इस विधि का प्रयोग आमतौर पर प्रोग्रामर-परिभाषित हेडर फ़ाइलों को शामिल करने के लिए किया जाता है।

खोज पथ पर जीसीसी दस्तावेज में एक और पूर्ण विवरण उपलब्ध है।


ऐसा होता है:

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

के साथ या तो उस फ़ाइल की निर्देशिका है जहां #include अंतर्निहित है, और / या कंपाइलर की वर्तमान कार्यशील निर्देशिका, और / या default_include_paths

तथा

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

यदि ./ <default_include_paths> , तो इससे कोई फर्क नहीं पड़ता है।

यदि mypath/myfile दूसरे में है निर्देशिका शामिल है, व्यवहार अपरिभाषित है।


कम से कम जीसीसी संस्करण <= 3.0 के लिए, कोण-ब्रैकेट फ़ॉर्म शामिल फ़ाइल और एक सहित एक निर्भरता उत्पन्न नहीं करता है।

इसलिए यदि आप निर्भरता नियम उत्पन्न करना चाहते हैं (उदाहरण के लिए जीसीसी-एम विकल्प का उपयोग करके), तो उन फ़ाइलों के लिए उद्धृत फ़ॉर्म का उपयोग करना चाहिए जिन्हें निर्भरता पेड़ में शामिल किया जाना चाहिए।

( http://gcc.gnu.org/onlinedocs/cpp/Invocation.html देखें)


महान उत्तरों के लिए धन्यवाद, esp। एडम Stelmaszczyk और piCookie, और एआईबी।

कई प्रोग्रामर की तरह, मैंने एप्लिकेशन विशिष्ट फ़ाइलों के लिए "myApp.hpp" फ़ॉर्म का उपयोग करने के अनौपचारिक सम्मेलन का उपयोग किया है, और लाइब्रेरी और कंपाइलर सिस्टम फ़ाइलों के लिए <libHeader.hpp> फ़ॉर्म, यानी /I में निर्दिष्ट फ़ाइलों और <libHeader.hpp> पर्यावरण चर , वर्षों के लिए सोच रहा था कि मानक था।

हालांकि, सी मानक बताता है कि खोज आदेश कार्यान्वयन विशिष्ट है, जो पोर्टेबिलिटी जटिल बना सकता है। मामलों को और खराब बनाने के लिए, हम जाम का उपयोग करते हैं, जो स्वचालित रूप से आंकड़े बताते हैं कि फाइलें कहां हैं। आप अपनी फ़ाइलों को शामिल करने के लिए सापेक्ष या पूर्ण पथ का उपयोग कर सकते हैं। अर्थात

#include "../../MyProgDir/SourceDir1/someFile.hpp"

एमएसवीएस के पुराने संस्करणों में डबल बैकस्लाश (\\) की आवश्यकता होती है, लेकिन अब इसकी आवश्यकता नहीं है। मुझे नहीं पता कि यह कब बदल गया। 'निक्स (विंडोज़ इसे स्वीकार करेगा) के साथ संगतता के लिए बस आगे की स्लैश का उपयोग करें।

यदि आप इसके बारे में वास्तव में चिंतित हैं, तो स्रोत कोड के रूप में एक ही निर्देशिका में फ़ाइल शामिल करने के लिए "./myHeader.h" उपयोग करें (मेरी वर्तमान, बहुत बड़ी परियोजना में कुछ डुप्लिकेट में बिखरे हुए फ़ाइल नाम शामिल हैं - वास्तव में एक कॉन्फ़िगरेशन प्रबंधन समस्या )।

यहां आपकी सुविधा के लिए यहां सूचीबद्ध एमएसडीएन स्पष्टीकरण दिया गया है)।

उद्धृत रूप

प्रीप्रोसेसर इस क्रम में फ़ाइलों को शामिल करने के लिए खोज करता है:

  1. उस फ़ाइल में उसी निर्देशिका में जिसमें # अंतर्निहित कथन शामिल है।
  2. वर्तमान में खोले गए निर्देशिकाओं की निर्देशिका में, जिसमें रिवर्स ऑर्डर में फ़ाइलें शामिल हैं
    वे खोले गए थे। खोज में माता-पिता की निर्देशिका में फ़ाइल शुरू होती है और
    किसी भी दादाजी की निर्देशिकाओं के माध्यम से ऊपर की ओर जारी है फ़ाइलें शामिल हैं।
  3. प्रत्येक /I कंपाइलर विकल्प द्वारा निर्दिष्ट पथ के साथ।
  4. उन INCLUDE जो INCLUDE पर्यावरण चर द्वारा निर्दिष्ट हैं।

कोण-ब्रैकेट फॉर्म

प्रीप्रोसेसर इस क्रम में फ़ाइलों को शामिल करने के लिए खोज करता है:

  1. प्रत्येक /I कंपाइलर विकल्प द्वारा निर्दिष्ट पथ के साथ।
  2. संकलन करते समय कमांड लाइन पर, पथ के साथ जो INCLUDE पर्यावरण चर द्वारा निर्दिष्ट हैं।

मानक द्वारा - हाँ, वे अलग हैं:

  • फॉर्म का प्रीप्रोसेसिंग निर्देश

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

    < और > delimiters के बीच निर्दिष्ट अनुक्रम द्वारा विशिष्ट रूप से पहचाने गए शीर्षलेख के लिए क्रियान्वयन-परिभाषित स्थानों का एक अनुक्रम खोजता है, और हेडर की संपूर्ण सामग्री द्वारा उस निर्देश के प्रतिस्थापन का कारण बनता है। स्थानों को कैसे निर्दिष्ट किया गया है या पहचान की गई हेडर कार्यान्वयन-परिभाषित है।

  • फॉर्म का प्रीप्रोसेसिंग निर्देश

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

    "निर्देशक " बीच निर्दिष्ट अनुक्रम द्वारा पहचाने गए स्रोत फ़ाइल की संपूर्ण सामग्री द्वारा उस निर्देश के प्रतिस्थापन का कारण बनता है। नामित स्रोत फ़ाइल को क्रियान्वयन-परिभाषित तरीके से खोजा जाता है। यदि यह खोज समर्थित नहीं है, या यदि खोज विफल हो जाती है , निर्देश को पुन: संसाधित किया जाता है जैसे कि यह पढ़ता है

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

    मूल निर्देश से समान निहित अनुक्रम (जिसमें > वर्ण, यदि कोई हो) शामिल है।

  • फॉर्म का प्रीप्रोसेसिंग निर्देश

    #include pp-tokens new-line
    

    (जो दो पिछले रूपों में से एक से मेल नहीं खाता है) की अनुमति है। निर्देश में include होने के बाद प्रीप्रोकैसिंग टोकन सामान्य पाठ के रूप में संसाधित होते हैं। (वर्तमान में एक मैक्रो नाम के रूप में परिभाषित प्रत्येक पहचानकर्ता को प्रीप्रोकैसिंग टोकन की प्रतिस्थापन सूची द्वारा प्रतिस्थापित किया जाता है।) सभी प्रतिस्थापन के परिणामस्वरूप निर्देश दो पिछले रूपों में से एक से मेल खाता है। जिस विधि से < और a > preprocessing टोकन जोड़ी या " वर्णों की एक जोड़ी " बीच प्रीप्रोकैसिंग टोकन का अनुक्रम एक हेडर नाम में जोड़ा जाता है, प्रीप्रोकैसिंग टोकन कार्यान्वयन-परिभाषित है।

परिभाषाएं:

  • एच-char: नए-पंक्ति चरित्र और > को छोड़कर स्रोत चरित्र सेट के किसी भी सदस्य

  • क्यू-चार: नए-पंक्ति चरित्र को छोड़कर स्रोत चरित्र सेट के किसी भी सदस्य और "

ध्यान दें कि मानक कार्यान्वयन-परिभाषित शिष्टाचार के बीच कोई संबंध नहीं बताता है। पहला फॉर्म एक कार्यान्वयन-परिभाषित तरीके से खोजता है, और दूसरा एक (संभवतः अन्य) कार्यान्वयन-परिभाषित तरीके से खोजता है। मानक यह भी निर्दिष्ट करता है कि कुछ फ़ाइलें शामिल होंगी (उदाहरण के लिए, <stdio.h> )।

औपचारिक रूप से आपको अपने कंपाइलर के लिए मैनुअल पढ़ना होगा, हालांकि सामान्य रूप से (परंपरा द्वारा) #include "..." फ़ॉर्म उस फ़ाइल की निर्देशिका को खोजता है जिसमें #include पहले पाया गया था, और फिर निर्देशिकाएं #include <...> फॉर्म खोज (पथ शामिल करें, जैसे सिस्टम हेडर) शामिल करें।


यहां कुछ अच्छे उत्तर सी मानक के संदर्भ बनाते हैं लेकिन पीओएसईक्स मानक भूल गए हैं, खासकर सी 99 (जैसे सी कंपाइलर) कमांड का विशिष्ट व्यवहार।

ओपन ग्रुप बेस निर्दिष्टीकरण अंक 7 के मुताबिक,

-आई निर्देशिका

सामान्य स्थानों को देखने से पहले निर्देशिका पथनाम द्वारा नामित निर्देशिका में देखने के लिए शीर्षलेख नहीं हैं जिनके नाम शीर्षलेखों के लिए खोज करने के लिए एल्गोरिदम बदलें। इस प्रकार, जिन शीर्षकों को डबल-कोट्स ("") में संलग्न किया गया है, उन्हें # शामिल पंक्ति के साथ फ़ाइल की निर्देशिका में पहली बार खोजा जाएगा, फिर -आई विकल्पों में नामित निर्देशिकाओं में, और सामान्य स्थानों में अंतिम बार खोजा जाएगा। हेडर के लिए जिनके नाम कोण ब्रैकेट ("<>") में संलग्न हैं, शीर्षलेख केवल इन-आई विकल्पों में नामित निर्देशिकाओं में और फिर सामान्य स्थानों में खोजा जाएगा। -आई विकल्पों में नामित निर्देशिकाओं को निर्दिष्ट क्रम में खोजा जाएगा। कार्यान्वयन एक ही सी 99 कमांड आमंत्रण में इस विकल्प के कम से कम दस उदाहरणों का समर्थन करेगा।

तो, एक POSIX अनुपालन वातावरण में, एक POSIX अनुपालन सी कंपाइलर के साथ, #include "file.h" ./file.h #include "file.h" संभवतः ./file.h लिए खोज करने जा रहा है, जहां . निर्देशिका है जिसमें #include अंतर्निहित कथन वाला फ़ाइल है, जबकि #include <file.h> , संभवतः /usr/include/file.h खोज करने जा रहा है, जहां /usr/include आपके सिस्टम को सामान्य स्थानों के लिए परिभाषित किया गया है हेडर (ऐसा लगता है कि POSIX द्वारा परिभाषित नहीं किया गया है)।


यहां दिए गए कई उत्तरों फ़ाइल को खोजने के लिए संकलक पथ पर ध्यान केंद्रित करेंगे। हालांकि अधिकांश कंपेलर ऐसा करते हैं, एक मानक कंपाइलर को मानक शीर्षकों के प्रभावों के साथ प्रीप्रोग्राम करने की अनुमति दी जाती है, और एक स्विच के रूप में #include <list> का इलाज करने की अनुमति दी जाती है, और इसे फ़ाइल के रूप में मौजूद नहीं होना चाहिए।

यह पूरी तरह से काल्पनिक नहीं है। कम से कम एक कंपाइलर है जो इस तरह से काम करता है। मानक शीर्षकों के साथ केवल #include <xxx> का उपयोग करना अनुशंसित है।


सी ++ में, फ़ाइल को दो तरीकों से शामिल करें:

पहला वाला # शामिल है जो प्रीप्रोसेसर को पूर्वनिर्धारित डिफ़ॉल्ट स्थान में फ़ाइल को देखने के लिए कहता है। यह स्थान प्रायः एक परिवेश वातावरण चर होता है जो फ़ाइलों को शामिल करने के पथ को इंगित करता है।

और दूसरा प्रकार #include "फ़ाइल नाम" है जो प्रीप्रोसेसर को वर्तमान निर्देशिका में फ़ाइल को देखने के लिए कहता है, फिर इसे पूर्वनिर्धारित स्थानों में स्थापित करने के लिए देखें।


जीसीसी दस्तावेज दोनों के बीच के अंतर के बारे में निम्नलिखित कहते हैं :

प्रीप्रोसेसिंग निर्देश '#include' का उपयोग कर उपयोगकर्ता और सिस्टम हेडर फ़ाइलों दोनों को शामिल किया गया है। इसमें दो प्रकार हैं:

#include <file>

इस संस्करण का उपयोग सिस्टम हेडर फ़ाइलों के लिए किया जाता है। यह सिस्टम निर्देशिकाओं की एक मानक सूची में फ़ाइल नाम की एक फ़ाइल की खोज करता है। आप इस सूची में निर्देशिका को -I विकल्प ( Invocation देखें) के साथ प्रीपेड कर सकते हैं।

#include "file"

यह संस्करण आपके स्वयं के कार्यक्रम की शीर्षलेख फ़ाइलों के लिए उपयोग किया जाता है। यह वर्तमान फ़ाइल वाली निर्देशिका में फ़ाइल नाम वाली फ़ाइल की खोज करता है, फिर उद्धरण निर्देशिकाओं में और फिर उसी <file> को <file> लिए उपयोग किया जाता है। आप निर्देशिका विकल्प के साथ उद्धरण निर्देशिकाओं की सूची में निर्देशिकाएं -iquote'#include' का तर्क, चाहे उद्धरण चिह्न या कोण ब्रैकेट के साथ सीमित हो, उस टिप्पणी में एक स्ट्रिंग निरंतर की तरह व्यवहार करता है, और मैक्रो नामों का विस्तार नहीं किया जाता है। इस प्रकार, #include <x/*y> x/*y नामक सिस्टम हेडर फ़ाइल को शामिल करने का निर्दिष्ट करता है।

हालांकि, अगर बैकस्लैश फ़ाइल के भीतर होती है, तो उन्हें सामान्य पाठ वर्ण माना जाता है, वर्णों से बचने के लिए नहीं। सी में स्ट्रिंग स्थिरांक के लिए उपयुक्त चरित्र से बचने वाले अनुक्रमों में से कोई भी संसाधित नहीं होता है। इस प्रकार, #include "x\n\\y" एक फ़ाइल नाम निर्दिष्ट करता है जिसमें तीन बैकस्लेश होते हैं। (कुछ सिस्टम '\' को पथनाम विभाजक के रूप में समझते हैं। ये सभी भी वैसे ही '/' की व्याख्या करते हैं। यह केवल '/' का उपयोग करने के लिए सबसे पोर्टेबल है।)

फ़ाइल नाम के बाद लाइन पर कुछ भी (टिप्पणियों के अलावा) कुछ त्रुटि है।


#include <file> tells the compiler to search for the header in its includes directory, eg for MinGW the compiler would search for file in C:\MinGW\include\ or wherever your compiler is installed.

#include "file" tells the compiler to search the current directory (ie the directory in which the source file resides) for file .

You can use the -I flag for GCC to tell it that, when it encounters an include with angled brackets, it should also search for headers in the directory after -I . For instance, if you have a file called myheader.h in your own directory, you could say #include <myheader.h> if you called GCC with -I . (indicating that it should search for includes in the current directory.)


#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.

परंतु,

#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 .


<file> में प्री-प्रोसेसर को -I निर्देशिकाओं और पूर्वनिर्धारित निर्देशिकाओं में पहले खोज करने के लिए कहा जाता है, फिर .c फ़ाइल की निर्देशिका में। "file" में प्रीप्रोसेसर को पहले स्रोत फ़ाइल की निर्देशिका को खोजने के लिए कहा जाता है, और फिर -I और पूर्वनिर्धारित पर वापस लौटाता है। सभी गंतव्यों को वैसे भी खोजा जाता है, केवल खोज का क्रम अलग होता है।

2011 मानक ज्यादातर "16.2 स्रोत फ़ाइल समावेशन" में फ़ाइलों को शामिल करने पर चर्चा करता है।

2 फॉर्म का प्रीप्रोसेसिंग निर्देश

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

<और> delimiters के बीच निर्दिष्ट अनुक्रम द्वारा विशिष्ट रूप से पहचाने गए शीर्षलेख के लिए क्रियान्वयन-परिभाषित स्थानों का एक अनुक्रम खोजता है, और हेडर की संपूर्ण सामग्री द्वारा उस निर्देश के प्रतिस्थापन का कारण बनता है। स्थानों को कैसे निर्दिष्ट किया गया है या पहचान की गई हेडर कार्यान्वयन-परिभाषित है।

3 फॉर्म का प्रीप्रोसेसिंग निर्देश

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

"निर्देशक" के बीच निर्दिष्ट अनुक्रम द्वारा पहचाने गए स्रोत फ़ाइल की संपूर्ण सामग्री द्वारा उस निर्देश के प्रतिस्थापन का कारण बनता है। नामित स्रोत फ़ाइल को क्रियान्वयन-परिभाषित तरीके से खोजा जाता है। यदि यह खोज समर्थित नहीं है, या यदि खोज विफल हो जाती है , निर्देश को पुन: संसाधित किया जाता है जैसे कि यह पढ़ता है

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

मूल निर्देश से समान निहित अनुक्रम (जिसमें> वर्ण, यदि कोई हो) शामिल है।

ध्यान दें कि अगर फ़ाइल नहीं मिली है तो "xxx" फ़ॉर्म <xxx> रूप में घटता है। शेष कार्यान्वयन-परिभाषित है।


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 अंतर्निहित निर्देश फ़ाइल के बाद तुरंत लाइन पर मौजूदा स्रोत फ़ाइल में फ़ाइल नाम द्वारा पहचाना गया स्रोत फ़ाइल शामिल है।

निर्देश खोज के पहले संस्करण में केवल मानक निर्देशिका शामिल हैं। मानक सी ++ लाइब्रेरी, साथ ही साथ मानक सी लाइब्रेरी, मानक में शामिल निर्देशिकाओं में शामिल है। मानक में निर्देशिकाएं संकलक विकल्पों के माध्यम से उपयोगकर्ता द्वारा नियंत्रित की जा सकती हैं।

दूसरा संस्करण सबसे पहले उस निर्देशिका को खोजता है जहां वर्तमान फ़ाइल रहता है और केवल तभी फ़ाइल नहीं मिलती है, मानक में निर्देशिका शामिल होती है।

यदि फ़ाइल नहीं मिली है, तो कार्यक्रम खराब हो गया है।


#include <abc.h>

मानक लाइब्रेरी फाइलों को शामिल करने के लिए प्रयोग किया जाता है। तो संकलक उन स्थानों में जांच करेगा जहां मानक लाइब्रेरी हेडर रह रहे हैं।

#include "xyz.h"

उपयोगकर्ता परिभाषित हेडर फ़ाइलों को शामिल करने के लिए कंपाइलर को बताएगा। तो कंपाइलर मौजूदा हेडर फ़ाइलों में इन हेडर फ़ाइलों की जांच करेगा या -I परिभाषित फ़ोल्डर्स।


  • #include <> पूर्वनिर्धारित शीर्षलेख फ़ाइलों के लिए है

यदि हेडर फ़ाइल पूर्वनिर्धारित है तो आप केवल हेडर फ़ाइल नाम को कोणीय ब्रैकेट में लिखेंगे, और ऐसा लगता है (मान लें कि हमारे पास एक पूर्वनिर्धारित हैडर फ़ाइल नाम iostream है):

#include <iostream>
  • #include " " हेडर फाइलों के लिए है प्रोग्रामर परिभाषित करता है

यदि आप (प्रोग्रामर) ने अपनी हेडर फ़ाइल लिखी है तो आप उद्धरण में हेडर फ़ाइल नाम लिखेंगे। तो, मान लीजिए कि आपने myfile.h नामक एक हेडर फ़ाइल लिखी है, तो यह एक उदाहरण है कि आप उस फ़ाइल को शामिल करने के लिए निर्देश शामिल करने का उपयोग कैसे करेंगे:

#include "myfile.h"





c-preprocessor