सी और सी ++ प्रोग्रामिंग भाषाओं में, कोण कोष्ठक का उपयोग करने और एक include
बयान में उद्धरण का उपयोग करने के बीच अंतर क्या है ?
#include <filename>
#include "filename"
सी और सी ++ प्रोग्रामिंग भाषाओं में, कोण कोष्ठक का उपयोग करने और एक include
बयान में उद्धरण का उपयोग करने के बीच अंतर क्या है ?
#include <filename>
#include "filename"
जवाबों:
व्यवहार में, अंतर उस स्थान पर है जहां प्रीप्रोसेसर शामिल फ़ाइल की खोज करता है।
के लिए #include <filename>
पूर्वप्रक्रमक खोजें एक कार्यान्वयन निर्भर तरीके से, खोज निर्देशिका में सामान्य रूप से संकलक / आईडीई द्वारा पूर्व-निर्धारित। यह विधि आम तौर पर मानक पुस्तकालय हेडर फ़ाइलों को शामिल करने के लिए उपयोग की जाती है।
के लिए #include "filename"
निर्देश युक्त फ़ाइल उसी निर्देशिका में पहले, और फिर पूर्वप्रक्रमक खोज खोज के लिए इस्तेमाल किया पथ का अनुसरण #include <filename>
प्रपत्र। इस पद्धति का उपयोग आम तौर पर प्रोग्रामर-परिभाषित हेडर फ़ाइलों को शामिल करने के लिए किया जाता है।
खोज पथों पर GCC प्रलेखन में एक अधिक संपूर्ण विवरण उपलब्ध है ।
#include <...>
तो सिस्टम पर स्थापित पैकेज का #include "..."
उपयोग किया और पास के रिपॉजिटरी संस्करण का उपयोग किया। मैं उन पीछे की ओर हो सकता है। किसी भी तरह से, पैकेज्ड हैडर में शामिल गार्ड को अंडरस्कोर के साथ उपसर्ग किया जाता है। (यह पैकेजों के लिए एक सम्मेलन हो सकता है या शायद दोनों को जानबूझकर रोकने का एक तरीका हो सकता है, हालांकि संस्करण क्वालिफ़ायर मेरे लिए कोई मतलब नहीं होगा।)
आपके कार्यान्वयन का प्रलेखन पढ़ने का एकमात्र तरीका पता है।
में सी मानक , खंड 6.10.2, अनुच्छेद 2 से 4 राज्य:
प्रपत्र का एक पूर्वप्रक्रमक निर्देश
#include <h-char-sequence> new-line
एक हेडर के लिए कार्यान्वयन-परिभाषित स्थानों के अनुक्रम को
<
और>
सीमांकक के बीच निर्दिष्ट अनुक्रम द्वारा विशिष्ट रूप से पहचाना जाता है, और हेडर की संपूर्ण सामग्री द्वारा उस निर्देश के प्रतिस्थापन का कारण बनता है । स्थानों को कैसे निर्दिष्ट किया जाता है या हेडर की पहचान की गई है, कार्यान्वयन-परिभाषित है।प्रपत्र का एक पूर्वप्रक्रमक निर्देश
#include "q-char-sequence" new-line
सीमांकक के बीच निर्दिष्ट अनुक्रम द्वारा पहचानी गई स्रोत फ़ाइल की संपूर्ण सामग्री द्वारा उस निर्देश के प्रतिस्थापन का कारण बनता
"
है। नामित स्रोत फ़ाइल को कार्यान्वयन-परिभाषित तरीके से खोजा जाता है। यदि यह खोज समर्थित नहीं है, या यदि खोज विफल हो जाती है, तो निर्देश पुन: मुद्रित किया जाता है जैसे कि यह पढ़ा जाता है#include <h-char-sequence> new-line
>
मूल निर्देश से समान निहित अनुक्रम ( वर्णों सहित , यदि कोई हो) के साथ।प्रपत्र का एक पूर्वप्रक्रमक निर्देश
#include pp-tokens new-line
(यह दो पिछले रूपों में से एक से मेल नहीं खाता) की अनुमति है।
include
निर्देश के बाद प्रीप्रोसेसिंग टोकन सामान्य पाठ की तरह ही संसाधित होते हैं। (वर्तमान में प्रत्येक पहचानकर्ता को एक स्थूल नाम के रूप में परिभाषित किया गया है, इसकी जगह प्रीप्रोसेसिंग टोकन की सूची है।) सभी प्रतिस्थापनों के बाद का निर्देश दो पिछले रूपों में से एक से मेल खाएगा। वह विधि जिसके द्वारा ए<
और>
प्रीप्रोसेसिंग टोकन जोड़ी या"
वर्णों के जोड़े के बीच प्रीप्रोसेसिंग टोकन का क्रम एकल हेडर नाम से जोड़ा जाता है प्रीप्रोसेसिंग टोकन कार्यान्वयन-परिभाषित है।परिभाषाएं:
h-char: स्रोत वर्ण का कोई भी सदस्य नई-लाइन वर्ण को छोड़कर सेट करता है और
>
q-char: स्रोत वर्ण का कोई भी सदस्य नई-लाइन वर्ण को छोड़कर सेट करता है और
"
<और> के बीच के वर्णों का क्रम विशिष्ट रूप से एक हेडर को संदर्भित करता है, जो जरूरी नहीं कि एक फ़ाइल हो। जैसा कि वे चाहते हैं, चरित्र अनुक्रम का उपयोग करने के लिए कार्यान्वयन बहुत अधिक स्वतंत्र हैं। (अधिकतर, हालांकि, इसे केवल एक फ़ाइल नाम के रूप में माना जाता है और अन्य पोस्ट के रूप में शामिल पथ में खोज करें )।
यदि #include "file"
प्रपत्र का उपयोग किया जाता है, तो कार्यान्वयन पहले दिए गए नाम की एक फ़ाइल की तलाश करता है, यदि समर्थित है। यदि नहीं (समर्थित), या यदि खोज विफल हो जाती है, तो कार्यान्वयन व्यवहार करता है जैसे कि अन्य ( #include <file>
) फॉर्म का उपयोग किया गया था।
इसके अलावा, एक तीसरा रूप मौजूद है और इसका उपयोग तब किया जाता है जब #include
निर्देश ऊपर के किसी भी रूप से मेल नहीं खाता है। इस रूप में, कुछ बुनियादी प्रीप्रोसेसिंग (जैसे मैक्रो विस्तार) #include
निर्देश के "ऑपरेंड" पर किया जाता है , और परिणाम दो अन्य रूपों में से एक से मेल खाने की उम्मीद है।
<
और स्ट्रिंग का उपयोग किया >
।
यहाँ कुछ अच्छे उत्तर सी मानक के संदर्भ में हैं, लेकिन POSIX मानक को भूल गए, विशेष रूप से c99 (जैसे C संकलक) कमांड के विशिष्ट व्यवहार ।
के अनुसार ओपन समूह बेस विनिर्देशों अंक 7 ,
-मैं निर्देशिका
हेडर की खोज के लिए एल्गोरिथ्म को बदलें जिनके नाम सामान्य स्थानों में देखने से पहले डायरेक्टरी पाथनाम नाम की निर्देशिका में देखने के लिए पूर्ण पथनाम नहीं हैं। इस प्रकार, शीर्षलेख जिनके नाम डबल-कोट्स ("") में संलग्न हैं, उन्हें पहले फ़ाइल की निर्देशिका में #include लाइन के साथ खोजा जाएगा , फिर -I विकल्पों में नामित निर्देशिकाओं में , और सामान्य स्थानों पर अंतिम। हेडर जिनके नाम कोण कोष्ठक ("<>") में संलग्न हैं, हेडर केवल -I विकल्प में और फिर सामान्य स्थानों में नामित निर्देशिकाओं के लिए खोजा जाएगा । निर्दिष्ट किए गए क्रम में -I विकल्पों में नामित निर्देशिकाएं खोजी जाएंगी।c99 कमांड मंगलाचरण।
इसलिए, एक POSIX आज्ञाकारी वातावरण में, एक POSIX आज्ञाकारी C संकलक के साथ, #include "file.h"
संभवतः ./file.h
पहले की खोज करने जा रहा है , जहां .
निर्देशिका है जहां #include
कथन के साथ फ़ाइल है , जबकि #include <file.h>
, संभवतः /usr/include/file.h
पहले के लिए खोज करने जा रहा है , जहां /usr/include
आपका सिस्टम परिभाषित है। हेडर के लिए सामान्य स्थान (यह POSIX द्वारा परिभाषित नहीं लगता है)।
c99
- जो C कंपाइलर के लिए POSIX नाम है। (POSIX 2008 मानक शायद ही C11 को संदर्भित कर सकता है; POSIX 2008 के लिए 2013 के अपडेट ने C मानक को उसके द्वारा निर्दिष्ट किए गए परिवर्तन को नहीं बदला।)
-L
।
GCC प्रलेखन का कहना है कि दोनों के बीच अंतर के बारे में निम्नलिखित हैं:
उपयोगकर्ता और सिस्टम हेडर दोनों फाइलें प्रीप्रोसेसिंग निर्देश का उपयोग करके शामिल हैं
‘#include’
। इसके दो प्रकार हैं:
#include <file>
इस वैरिएंट का उपयोग सिस्टम हेडर फाइलों के लिए किया जाता है। यह सिस्टम निर्देशिकाओं की एक मानक सूची में एक फ़ाइल नामक फ़ाइल की खोज करता है। आप इस सूची में
-I
विकल्प ( आमंत्रण देखें ) के साथ निर्देशिकाओं को प्रस्तुत कर सकते हैं ।
#include "file"
इस संस्करण का उपयोग आपके स्वयं के प्रोग्राम की हेडर फ़ाइलों के लिए किया जाता है। यह निर्देशिका में पहले फ़ाइल नाम फ़ाइल की खोज करता है जिसमें वर्तमान फ़ाइल होती है, फिर उद्धरण निर्देशिकाओं में और फिर उसी निर्देशिका के लिए उपयोग की जाती है
<file>
। आप-iquote
विकल्प के साथ निर्देशिकाओं की सूची के लिए निर्देशिकाओं को प्रस्तुत कर सकते हैं । का तर्क‘#include’
, चाहे उद्धरण चिह्नों या कोण कोष्ठक के साथ सीमांकित हो, एक स्ट्रिंग स्थिरांक की तरह व्यवहार करता है कि टिप्पणियों को मान्यता नहीं दी जाती है, और मैक्रो नामों का विस्तार नहीं किया जाता है। इस प्रकार,#include <x/*y>
नामित एक सिस्टम हेडर फ़ाइल के समावेश को निर्दिष्ट करता हैx/*y
।हालाँकि, यदि बैकस्लैश फ़ाइल के भीतर होते हैं, तो उन्हें साधारण पाठ वर्ण माना जाता है, वर्णों से बचकर नहीं। सी में स्ट्रिंग स्थिरांक के लिए उपयुक्त वर्ण भागने के अनुक्रमों में से कोई भी संसाधित नहीं है। इस प्रकार,
#include "x\n\\y"
एक फ़ाइल नाम निर्दिष्ट करता है जिसमें तीन बैकस्लैश होते हैं। (कुछ सिस्टम '\' की व्याख्या पथनाम विभाजक के रूप में करते हैं। ये सभी‘/’
समान तरीके से व्याख्या करते हैं। यह केवल उपयोग करने के लिए सबसे पोर्टेबल है‘/’
।)यह एक त्रुटि है अगर फ़ाइल नाम के बाद लाइन पर कुछ भी (टिप्पणियों के अलावा) है।
ऐसा होता है:
"mypath/myfile" is short for ./mypath/myfile
साथ .
या तो जहां फ़ाइल की निर्देशिका जा रहा है #include
में निहित है, और / या संकलक की वर्तमान कार्यशील निर्देशिका, और / याdefault_include_paths
तथा
<mypath/myfile> is short for <defaultincludepaths>/mypath/myfile
अगर ./
अंदर है <default_include_paths>
, तो इससे कोई फर्क नहीं पड़ता।
यदि mypath/myfile
कोई अन्य शामिल निर्देशिका में है, तो व्यवहार अपरिभाषित है।
#include "mypath/myfile"
बराबर नहीं है #include "./mypath/myfile"
। जैसा कि piCookie का उत्तर कहता है, दोहरे उद्धरण संकलक को कार्यान्वयन-परिभाषित तरीके से खोजने के लिए कहते हैं - जिसमें निर्दिष्ट स्थानों में खोज शामिल है #include <...>
। (वास्तव में, यह शायद बराबर है, लेकिन केवल इसलिए, उदाहरण के लिए, के /usr/include/mypath/myfile
रूप में संदर्भित किया जा सकता है /usr/include/./mypath/myfile
- कम से कम यूनिक्स जैसी प्रणालियों पर।)
defaultincludepaths
, जैसा कि एक और अर्थ देने के विपरीत है .
(जैसा कि ऊपर कहा गया है)। यह अपेक्षित परिणाम है कि दोनों #include "..."
और dirpath#include <...>
में खोज करते हैं
<file>
शामिल में खोज करने के लिए पूर्वप्रक्रमक बताता -I
निर्देशिका और पूर्वनिर्धारित निर्देशिका में पहले , तो ग फ़ाइल की निर्देशिका में। इसमें "file"
स्रोत फ़ाइल की निर्देशिका को पहले खोजने के लिए प्रीप्रोसेसर को शामिल किया गया है , और फिर वापस -I
और पूर्वनिर्धारित किया गया है। सभी गंतव्यों को वैसे भी खोजा जाता है, केवल खोज का क्रम अलग होता है।
2011 का मानक ज्यादातर "16.2 स्रोत फ़ाइल समावेशन" में शामिल फ़ाइलों की चर्चा करता है।
2 फार्म का एक प्रीप्रोसेसिंग निर्देश
# include <h-char-sequence> new-line
हेडर के लिए निर्दिष्ट अनुक्रम द्वारा विशिष्ट रूप से पहचाने गए हेडर के लिए कार्यान्वयन-परिभाषित स्थानों के अनुक्रम की खोज करता है, और हेडर की संपूर्ण सामग्री द्वारा उस निर्देश के प्रतिस्थापन का कारण बनता है। स्थानों को कैसे निर्दिष्ट किया जाता है या पहचाने जाने वाले शीर्षलेख कार्यान्वयन-परिभाषित है।
3 फार्म का एक प्रीप्रोसेसिंग निर्देश
# include "q-char-sequence" new-line
"सीमांकक के बीच निर्दिष्ट अनुक्रम द्वारा पहचानी गई स्रोत फ़ाइल की संपूर्ण सामग्री द्वारा उस निर्देश के प्रतिस्थापन का कारण बनता है। नामित स्रोत फ़ाइल को कार्यान्वयन-परिभाषित तरीके से खोजा जाता है। यदि यह खोज समर्थित नहीं है, या यदि खोज विफल हो जाती है। निर्देश को पुन: प्रकाशित किया जाता है जैसे कि यह पढ़ा जाता है
# include <h-char-sequence> new-line
मूल निर्देश से समान समाहित अनुक्रम (> वर्ण, यदि कोई हो) के साथ।
ध्यान दें कि यदि फ़ाइल नहीं मिली है तो "xxx"
फ़ॉर्म को संक्षिप्त करें <xxx>
। बाकी कार्यान्वयन-परिभाषित है।
-I
व्यवसाय कहां निर्दिष्ट है?
-I
।
#include <file.h>
कम्पाइलर को इसके "हेडर" में हेडर की खोज करने के लिए कहता है, जैसे कि मिनगॉ के लिए कंपाइलर file.h
C: \ MinGW \ में शामिल होगा या जहां भी आपका कंपाइलर स्थापित है, उसकी खोज करेंगे।
#include "file"
संकलक को वर्तमान निर्देशिका (यानी वह निर्देशिका जिसमें स्रोत फ़ाइल रहती है) को खोजने के लिए कहता है file
।
आप -I
यह बताने के लिए GCC के लिए ध्वज का उपयोग कर सकते हैं कि, जब यह एंगल्ड कोष्ठक के साथ सम्मिलित करता है, तो इसके बाद निर्देशिका में हेडर की भी खोज करनी चाहिए -I
। जीसीसी झंडे के बाद निर्देशिका का इलाज करेगा जैसे कि वह includes
निर्देशिका थी।
उदाहरण के लिए, यदि आपके पास myheader.h
अपनी निर्देशिका में एक फ़ाइल है , तो आप यह कह सकते हैं कि #include <myheader.h>
क्या आपने ध्वज के साथ जीसीसी को कॉल किया था -I .
(यह दर्शाता है कि उसे वर्तमान निर्देशिका में शामिल होना चाहिए।)
-I
ध्वज के बिना , आपको #include "myheader.h"
फ़ाइल को शामिल करने के लिए, या अपने संकलक myheader.h
की include
निर्देशिका में स्थानांतरित करने के लिए उपयोग करना होगा ।
मानक द्वारा - हाँ, वे अलग हैं:
प्रपत्र का एक पूर्वप्रक्रमक निर्देश
#include <h-char-sequence> new-line
एक हैडर के बीच निर्दिष्ट अनुक्रम द्वारा विशिष्ट पहचान के लिए कार्यान्वयन से परिभाषित स्थानों में से एक दृश्य खोज
<
और>
सीमांकक, और हेडर की संपूर्ण सामग्री द्वारा कि निर्देश के प्रतिस्थापन का कारण बनता है। स्थानों को कैसे निर्दिष्ट किया जाता है या हेडर की पहचान की गई है, कार्यान्वयन-परिभाषित है।प्रपत्र का एक पूर्वप्रक्रमक निर्देश
#include "q-char-sequence" new-line
"
सीमांकक के बीच निर्दिष्ट अनुक्रम द्वारा पहचानी गई स्रोत फ़ाइल की संपूर्ण सामग्री द्वारा उस निर्देश के प्रतिस्थापन का कारण बनता है। नामित स्रोत फ़ाइल को कार्यान्वयन-परिभाषित तरीके से खोजा जाता है। यदि यह खोज समर्थित नहीं है, या यदि खोज विफल हो जाती है, तो निर्देश पुन: मुद्रित किया जाता है जैसे कि यह पढ़ा जाता है#include <h-char-sequence> new-line
>
मूल निर्देश से समान निहित अनुक्रम ( वर्णों सहित , यदि कोई हो) के साथ।प्रपत्र का एक पूर्वप्रक्रमक निर्देश
#include pp-tokens new-line
(यह दो पिछले रूपों में से एक से मेल नहीं खाता) की अनुमति है।
include
निर्देश के बाद प्रीप्रोसेसिंग टोकन सामान्य पाठ की तरह ही संसाधित होते हैं। (वर्तमान में प्रत्येक पहचानकर्ता को एक स्थूल नाम के रूप में परिभाषित किया गया है, इसकी जगह प्रीप्रोसेसिंग टोकन की सूची है।) सभी प्रतिस्थापनों के बाद का निर्देश दो पिछले रूपों में से एक से मेल खाएगा। वह विधि जिसके द्वारा ए<
और>
प्रीप्रोसेसिंग टोकन जोड़ी या"
वर्णों के जोड़े के बीच प्रीप्रोसेसिंग टोकन का क्रम एकल हेडर नाम से जोड़ा जाता है प्रीप्रोसेसिंग टोकन कार्यान्वयन-परिभाषित है।परिभाषाएं:
h-char: स्रोत वर्ण का कोई भी सदस्य नई-लाइन वर्ण को छोड़कर सेट करता है और
>
q-char: स्रोत वर्ण का कोई भी सदस्य नई-लाइन वर्ण को छोड़कर सेट करता है और
"
ध्यान दें कि मानक कार्यान्वयन-परिभाषित शिष्टाचार के बीच कोई संबंध नहीं बताता है। पहला फ़ॉर्म एक कार्यान्वयन-परिभाषित तरीके से खोज करता है, और दूसरा एक (संभवतः अन्य) कार्यान्वयन-परिभाषित तरीके से। मानक यह भी निर्दिष्ट करता है कि कुछ शामिल फाइलें मौजूद होंगी (उदाहरण के लिए <stdio.h>
)।
औपचारिक रूप से आपको अपने संकलक के लिए मैनुअल पढ़ना होगा, हालांकि सामान्य रूप से (परंपरा से) #include "..."
प्रपत्र उस फ़ाइल की निर्देशिका को खोजता है जिसमें #include
पहले पाया गया था, और फिर निर्देशिका जो #include <...>
प्रपत्र खोजती है (पथ शामिल करें, जैसे सिस्टम हेडर) )।
महान जवाब के लिए धन्यवाद, esp। एडम स्टेल्माज़्स्की और पिक्की, और ऐब।
कई प्रोग्रामर की तरह, मैंने "myApp.hpp"
एप्लिकेशन विशिष्ट फ़ाइलों के लिए फ़ॉर्म का उपयोग करने के अनौपचारिक सम्मेलन का उपयोग किया है , और <libHeader.hpp>
पुस्तकालय और कंपाइलर सिस्टम फ़ाइलों के लिए फ़ॉर्म, अर्थात ( /I
और INCLUDE
पर्यावरण चर में निर्दिष्ट फ़ाइलों के लिए, जो मानक था) के लिए सोच रहा था।
हालांकि, सी मानक कहता है कि खोज आदेश कार्यान्वयन विशिष्ट है, जो पोर्टेबिलिटी को जटिल बना सकता है। मामलों को बदतर बनाने के लिए, हम जाम का उपयोग करते हैं, जो स्वचालित रूप से यह पता लगाता है कि फ़ाइलें कहाँ हैं। आप अपनी शामिल फ़ाइलों के लिए सापेक्ष या निरपेक्ष पथ का उपयोग कर सकते हैं। अर्थात
#include "../../MyProgDir/SourceDir1/someFile.hpp"
MSVS के पुराने संस्करणों को डबल बैकस्लैश (\\) की आवश्यकता थी, लेकिन अब इसकी आवश्यकता नहीं है। मुझे नहीं पता कि यह कब बदल गया। बस 'निक्स' के साथ संगतता के लिए फॉरवर्ड स्लैश का उपयोग करें (विंडोज यह स्वीकार करेगा)।
यदि आप वास्तव में इसके बारे में चिंतित हैं, "./myHeader.h"
तो स्रोत कोड के रूप में एक ही निर्देशिका में एक शामिल फ़ाइल के लिए उपयोग करें (मेरे वर्तमान, बहुत बड़ी परियोजना में कुछ डुप्लिकेट शामिल हैं फ़ाइल नाम बिखरे हुए हैं - वास्तव में एक कॉन्फ़िगरेशन प्रबंधन समस्या)।
यहाँ MSDN स्पष्टीकरण यहां आपकी सुविधा के लिए नकल की)।
उद्धृत रूप
प्रीप्रोसेसर इस क्रम में फ़ाइलों को शामिल करने के लिए खोज करता है:
- उसी निर्देशिका में जिस फ़ाइल में #include स्टेटमेंट है।
- वर्तमान में खोली गई निर्देशिकाओं में उल्टे क्रम में फाइलें शामिल हैं, जिसमें
वे खोले गए थे। माता-पिता की निर्देशिका में खोज शुरू होती है जिसमें फ़ाइल शामिल होती है और
किसी भी दादा-दादी की फाइलों में निर्देशिका के माध्यम से ऊपर की ओर जारी रहती है।- प्रत्येक
/I
कंपाइलर विकल्प द्वारा निर्दिष्ट पथ के साथ ।INCLUDE
पर्यावरण चर द्वारा निर्दिष्ट पथों के साथ ।कोण-कोष्ठक रूप
प्रीप्रोसेसर इस क्रम में फ़ाइलों को शामिल करने के लिए खोज करता है:
- प्रत्येक
/I
कंपाइलर विकल्प द्वारा निर्दिष्ट पथ के साथ ।- जब कमांड लाइन पर संकलन होता है, तो
INCLUDE
पर्यावरण चर द्वारा निर्दिष्ट पथों के साथ ।
कम से कम जीसीसी संस्करण <= 3.0 के लिए, कोण-ब्रैकेट फॉर्म में शामिल फ़ाइल और एक के बीच एक निर्भरता उत्पन्न नहीं होती है।
इसलिए यदि आप निर्भरता नियम (उदाहरण के लिए जीसीसी -एम विकल्प का उपयोग करके) उत्पन्न करना चाहते हैं, तो आपको उन फ़ाइलों के लिए उद्धृत प्रपत्र का उपयोग करना होगा जो निर्भरता के पेड़ में शामिल होने चाहिए।
के लिए #include ""
एक संकलक सामान्य रूप से फ़ाइल जो जिसमें शामिल करें और फिर अन्य फ़ोल्डर के फ़ोल्डर खोज करता है। के लिए #include <>
संकलक वर्तमान फ़ाइल का फ़ोल्डर खोज नहीं करता है।
<filename>
और "filename"
कार्यान्वयन-परिभाषित स्थानों की खोज करते हैं।
जब आप #include <filename> का उपयोग करते हैं, तो C- C ++ हेडर फ़ाइलों (stdio.h \ cstdio, string, वेक्टर, आदि) की निर्देशिका में फ़ाइल की तलाश में पूर्व-प्रोसेसर। लेकिन, जब आप #include "फ़ाइलनाम" का उपयोग करते हैं: पहला, वर्तमान-निर्देशिका में फ़ाइल की तलाश में पूर्व-प्रोसेसर, और यदि यह यहाँ नहीं है - तो वह C \ C ++ हेडर फ़ाइलों की निर्देशिका में खोज रहा है।
#include
निर्देश सख्ती से फ़ाइलों से संबंधित नहीं है।
कोण कोष्ठक के साथ एक #include "शामिल होने के लिए" सिस्टम हेडर "कहने का एक बहुत ही जटिल तरीका" (स्थानों का कार्यान्वयन-निर्भर सूची) खोजेगा।
उद्धरण के साथ एक #include बस एक फ़ाइल के लिए खोज करेगा (और, "एक कार्यान्वयन-निर्भर तरीके से", blh)। जिसका अर्थ है, सामान्य अंग्रेजी में, यह उस पथ / फ़ाइलनाम को लागू करने का प्रयास करेगा जिसे आप उस पर टॉस करते हैं और सिस्टम पथ को प्रीपेंड नहीं करेंगे या अन्यथा उसके साथ छेड़छाड़ करेंगे।
इसके अलावा, अगर #include "" विफल रहता है, तो इसे मानक के रूप में #include <> के रूप में फिर से पढ़ा जाता है।
जीसीसी प्रलेखन एक (संकलक विशिष्ट) वर्णन जो हालांकि जीसीसी के लिए विशिष्ट नहीं है और मानक जा रहा है, आईएसओ मानक के वकील शैली बात से समझने के लिए बहुत आसान है।
zlib.h
, मेरे पास मेरे 'उपयोगकर्ता' खोज पथ हैं, और सिस्टम खोज पथ में एक भिन्न संस्करण मौजूद है, तो क्या #include <zlib.h>
सिस्टम संस्करण #include "zlib.h"
शामिल है और मेरा अपना शामिल है?
#include "filename" // User defined header
#include <filename> // Standard library header.
उदाहरण:
यहाँ फ़ाइल नाम है Seller.h
:
#ifndef SELLER_H // Header guard
#define SELLER_H // Header guard
#include <string>
#include <iostream>
#include <iomanip>
class Seller
{
private:
char name[31];
double sales_total;
public:
Seller();
Seller(char[], double);
char*getName();
#endif
वर्ग कार्यान्वयन में (उदाहरण के लिए, Seller.cpp
और अन्य फ़ाइलों में जो फ़ाइल का उपयोग करेगा Seller.h
), उपयोगकर्ता द्वारा परिभाषित हेडर को अब शामिल किया जाना चाहिए, इस प्रकार है:
#include "Seller.h"
#include <>
पूर्वनिर्धारित हेडर फ़ाइलों के लिए हैयदि हेडर फ़ाइल पूर्वनिर्धारित है तो आप बस हेडर फ़ाइल नाम को कोणीय कोष्ठक में लिखेंगे, और यह इस तरह दिखेगा (मान लें कि हमारे पास पूर्वनिर्धारित हेडर फ़ाइल नाम iostream है):
#include <iostream>
#include " "
हैडर फ़ाइलों के लिए प्रोग्रामर परिभाषित करता हैयदि आप (प्रोग्रामर) ने अपनी खुद की हेडर फाइल लिखी है तो आप हेडर फाइल का नाम उद्धरणों में लिखेंगे। तो, मान लीजिए कि आपने हेडर फ़ाइल लिखी है myfile.h
, तो यह एक उदाहरण है कि आप उस फाइल को शामिल करने के लिए निर्देश को कैसे शामिल करेंगे:
#include "myfile.h"
यहाँ कई उत्तर फाइल को खोजने के लिए कंपाइलर खोजे जाने वाले रास्तों पर ध्यान केंद्रित करेंगे। हालांकि यह वही है जो अधिकांश कंपाइलर करते हैं, एक अनुरूप कंपाइलर को मानक हेडर के प्रभावों के साथ प्रीप्रोग्राम करने की अनुमति दी जाती है, और #include <list>
एक स्विच के रूप में इलाज करने, कहने के लिए, और यह एक फ़ाइल के रूप में मौजूद नहीं है।
यह विशुद्ध रूप से काल्पनिक नहीं है। कम से कम एक कंपाइलर है जो उस तरह से काम करता है। #include <xxx>
केवल मानक हेडर के साथ उपयोग करने की सिफारिश की जाती है।
#include <abc.h>
मानक लाइब्रेरी फ़ाइलों को शामिल करने के लिए उपयोग किया जाता है। इसलिए संकलक उन स्थानों पर जांच करेगा जहां मानक पुस्तकालय हेडर निवास कर रहे हैं।
#include "xyz.h"
कंपाइलर को उपयोगकर्ता-परिभाषित हेडर फ़ाइलों को शामिल करने के लिए बताएगा। तो कंपाइलर इन हेडर फ़ाइलों की वर्तमान फ़ोल्डर या -I
परिभाषित फ़ोल्डरों में जाँच करेगा ।
C ++ में, दो तरीकों से एक फ़ाइल शामिल करें:
पहले वाला #include है जो पूर्वनिर्धारित डिफ़ॉल्ट स्थान में फ़ाइल को देखने के लिए प्रीप्रोसेसर को बताता है। यह स्थान अक्सर एक INCLUDE वातावरण चर है जो फ़ाइलों को शामिल करने के लिए पथ को दर्शाता है।
और दूसरा प्रकार #include "फ़ाइलनाम" है जो पूर्ववर्ती निर्देशिका में फ़ाइल के लिए पहले देखने के लिए प्रीप्रोसेसर को बताता है, फिर इसे उन पूर्वनिर्धारित स्थानों में खोजें जिन्हें उपयोगकर्ता ने सेट किया है।
सबसे पहले, वर्तमान निर्देशिका में हेडर फ़ाइल की उपस्थिति के लिए देखता है जहां से निर्देश को लागू किया जाता है। यदि नहीं मिला है, तो यह मानक प्रणाली निर्देशिकाओं की पूर्वनिर्मित सूची में खोज करता है।
यह वर्तमान निर्देशिका में हेडर फ़ाइल की उपस्थिति के लिए दिखता है जहां से निर्देश को लागू किया जाता है।
सटीक खोज निर्देशिका सूची लक्ष्य प्रणाली पर निर्भर करती है कि जीसीसी कैसे कॉन्फ़िगर किया गया है और यह कहां स्थापित है। आप अपने जीसीसी संकलक की खोज निर्देशिका सूची को -v विकल्प के साथ चलाकर पा सकते हैं।
आप खोज मार्ग में अतिरिक्त निर्देशिकाओं को जोड़ सकते हैं - I dir , जिसके कारण dir को वर्तमान निर्देशिका (निर्देश के उद्धरण प्रपत्र के लिए) और मानक सिस्टम निर्देशिकाओं के आगे खोजा जा सकता है।
मूल रूप से, "xxx" वर्तमान निर्देशिका में खोज के अलावा कुछ भी नहीं है; अगर पर्चा वापस नहीं मिला
#include "header.h"
फॉर्म का विवरण सटीक नहीं है, @personal_cloud। मैं piCookie और Yann Droneaud के उत्तर को सबसे अधिक प्रासंगिक मानता हूं क्योंकि वे पहचानते हैं कि उनकी जानकारी कहां से आती है। मुझे शीर्ष-मतदान का उत्तर पूरी तरह से संतोषजनक नहीं लगता।
#include <filename>
जब एक सिस्टम फ़ाइल करने के लिए भेजा जा रहा है प्रयोग किया जाता है। यह एक हेडर फाइल है जिसे सिस्टम डिफॉल्ट स्थानों जैसे /usr/include
या पर पाया जा सकता है /usr/local/include
। अपनी खुद की फ़ाइलों के लिए जिन्हें आपको किसी अन्य प्रोग्राम में शामिल करना होगा, आपको #include "filename"
सिंटैक्स का उपयोग करना होगा ।
"सी फ़ाइल नाम>" मानक सी लाइब्रेरी स्थानों में खोज करता है
जबकि "फ़ाइल नाम" वर्तमान निर्देशिका में भी खोज करता है।
आदर्श रूप से, आप मानक सी पुस्तकालयों के लिए <...> का उपयोग करेंगे और उन पुस्तकालयों के लिए "..." जो आप लिखते हैं और वर्तमान निर्देशिका में मौजूद हैं।
साधारण सामान्य नियम है कि कंपाइलर के साथ आने वाली हेडर फ़ाइलों को शामिल करने के लिए एंगल्ड कोष्ठक का उपयोग किया जाता है। किसी भी अन्य हेडर फ़ाइलों को शामिल करने के लिए दोहरे उद्धरण चिह्नों का उपयोग करें। अधिकांश संकलक इसे इस तरह से करते हैं।
1.9 - हेडर फाइलें प्री-प्रोसेसर निर्देशों के बारे में अधिक विस्तार से बताती हैं। यदि आप एक नौसिखिए प्रोग्रामर हैं, तो उस पृष्ठ को आपको वह सब समझने में मदद करनी चाहिए। मैंने इसे यहां से सीखा है, और मैं काम पर इसका पालन कर रहा हूं।
#include <filename>
का उपयोग तब किया जाता है जब आप C / C ++ सिस्टम या कंपाइलर लाइब्रेरी की हेडर फ़ाइल का उपयोग करना चाहते हैं। ये पुस्तकालय stdio.h, string.h, math.h, आदि हो सकते हैं।
#include "path-to-file/filename"
का उपयोग तब किया जाता है जब आप अपनी स्वयं की कस्टम हेडर फ़ाइल का उपयोग करना चाहते हैं जो आपके प्रोजेक्ट फ़ोल्डर में या कहीं और है।
प्रीप्रोसेसर और हेडर के बारे में अधिक जानकारी के लिए। पढ़ें सी - प्रीप्रोसेसर ।
#include <filename>
#include "filename"
#include <filename>
उस हेडर फ़ाइल की तरह व्यवहार करता है और खोज करता है जहाँ सिस्टम हेडर फ़ाइलें संग्रहीत होती हैं।#include <filename>
।वर्तमान कॉन्फ़िगरेशन के आधार पर, gcc का उपयोग करके अपने सिस्टम पर खोज क्रम को देखने के लिए, आप निम्न कमांड निष्पादित कर सकते हैं। आप इस आदेश पर अधिक विवरण यहां पा सकते हैं
cpp -v /dev/null -o /dev/null
Apple LLVM संस्करण 10.0.0 (क्लैंग -1000.10.44.2)
लक्ष्य: x86_64-apple-darwin18.0.0
थ्रेड मॉडल: posix InstalledDir: Library / Developer / CommandLineTools / usr / bin
"" / लाइब्रेरी / डेवलपर / कमांडलाइनटूल / usr / bin / clang -cc1 -triple x86_64-apple-macosx10.14.0 -Wepepccated-objc-isa-use -Werror = deprecated-objc-isa-use -disable-free अक्षम-llvm-verifier -discard-value-names -main-file-name null -mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -fno-सख्त-वापसी-मैस्म-वर्बोज़ - munwind-tables -target-cpu penryn -dwarf-column-info -debugger-tuning = lldb -target-linker-version 409.12 -v -resource-dir /Library/Developer/CommandLineTools/usr/lib/clang/10.0.0 - isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk -I / usr / local / इसमें -fdebug-compilation-dir / Users / hogstrom -ferror-limit 19 -fmessage-length 80 -stack-protector 1-रक्षक -fencode- विस्तारित-ब्लॉक-हस्ताक्षर -fobjc-runtime = macosx-10.14।0 -fmax-type-align = 16 -fdiagnostics-show-option -fcolor-diagnostics -traditional-cpp -o - -xc / dev / null
clang -cc1 संस्करण 10.0.0 (clang-1000.10.44.2) डिफ़ॉल्ट लक्ष्य x86_64-apple-darwin18.0.0 कोई भी अयोग्य निर्देशिका की अनदेखी नहीं कर रहा है "/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/local/include" निरंतर स्रोत की अनदेखी। निर्देशिका "/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/Library/Frameworks"
#include "..." खोज यहां प्रारंभ होती है:
#incroe <...> खोज यहां प्रारंभ होती है:
/ usr / local / शामिल
/ लाइब्रेरी / डेवलपर / CommandLineTools / usr / lib / बजना / 10.0.0 / शामिल
/ Library / डेवलपर / CommandLineTools / usr / शामिल
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include
/ Library / डेवलपर / CommandLineTools / SDKs / MacOSX10.14.sdk / सिस्टम / लाइब्रेरी / फ्रेमवर्क (फ्रेमवर्क निर्देशिका)
खोज सूची का अंत।
#Include statement लिखने के दो तरीके मौजूद हैं। ये हैं:
#include"filename"
#include<filename>
प्रत्येक रूप का अर्थ है
#include"mylib.h"
यह कमांड mylib.h
वर्तमान निर्देशिका में फ़ाइल के लिए और साथ ही निर्देशिका की निर्दिष्ट सूची के रूप में एन खोजे जाने वाले खोज पथ को शामिल करेगा।
#include<mylib.h>
यह कमांड mylib.h
केवल निर्देशिका की निर्दिष्ट सूची में फ़ाइल की तलाश करेगी ।
खोज में शामिल पथ कुछ भी नहीं है, लेकिन निर्देशिकाओं की एक सूची है जो फ़ाइल के लिए खोज की जाएगी। अलग-अलग सी संकलक आपको अलग-अलग शिष्टाचार में खोज पथ सेट करने देते हैं।