2012-11-22 10 views
17

में 'आयात' जावा में 'आयात' सी/सी ++ में '# अंतर्निहित' जैसा व्यवहार करता है? विशेष रूप से, क्या इसमें संपूर्ण लाइब्रेरी शामिल होगी जो यह आयात कर रही है या क्या इसमें केवल कक्षाओं और विधियों को शामिल किया जाएगा जिन्हें बाद के कोड में कहा जाता है?जावा बनाम '#include' में सी/सी ++

+0

वास्तविक स्रोत केवल लिंक समय में जुड़ा हुआ है। प्रीप्रोसेसर प्रोटोटाइप युक्त केवल हेडर फाइलों को प्रतिस्थापित करता है। कृपया मेरा उत्तर भी देखें http://stackoverflow.com/a/19581919/986760 – fayyazkl

उत्तर

0

जो वास्तव में आप आयात करते हैं उस पर निर्भर करता है। सबसे छोटी आयात योग्य इकाई वर्ग है, सबसे बड़ा पैकेज है।
तो यदि आपको एक वर्ग की आवश्यकता है और पूरा पैकेज आयात करें तो यह पूरा पैकेज लाएगा।

24

#include दोनों में से कोई भी नहीं, न तो "आयात" पुस्तकालय, न ही कक्षाएं या मॉड्यूल।

#include निर्देश केवल पूर्व-प्रोसेसर को अन्य टेक्स्ट फ़ाइल (स्रोत) की सामग्री को शामिल करने के लिए कहता है। बस इतना ही।

प्री-प्रोसेसिंग फ़ाइल ए #include आईएनजी फ़ाइल बी का परिणाम कंपाइलर को पास किया गया है जैसे कि वे एक फ़ाइल थे, फ़ाइल बी में उस स्थिति में चिपकाया गया था जहां #include निर्देश दिया गया था।

स्पष्टीकरण के लिए यह बताएं: यह सब पूर्व किसी भी संकलन, कोड जनरेशन के लिए होता है।

साइड इफेक्ट के रूप में सी/सी ++ प्री-प्रोसेसर का उपयोग कंप्रेसर से स्वतंत्र रूप से किसी भी प्रकार की टेक्स्ट फ़ाइल इनपुट को संसाधित करने के लिए किया जा सकता है।

कोई तर्क दे सकता है कि #include जैसे प्री-प्रोसेसर स्टेटमेंट्स "सी/सी ++ भाषाओं का वास्तव में हिस्सा नहीं हैं", क्योंकि उन्हें अनिवार्य रूप से सी/सी ++ में किसी भी प्रोग्राम को लिखने की आवश्यकता नहीं है, क्योंकि वे कभी भी कंपाइलर को पास नहीं होते हैं ।

अभिव्यक्ति import का उपयोग (मानक) सी/सी ++ प्रोग्रामिंग के संदर्भ में नहीं किया जाता है, क्योंकि आयात करने के लिए कुछ भी नहीं है।

C/C++ मॉड्यूल एक साथ या तो डाल रहे हैं स्रोत स्तर पर पहले संकलन करने के लिए या लिंकर संकलन के बाद से।

+0

यह एक अच्छा स्पष्टीकरण समग्र +1 है। यद्यपि कुछ अंक। क्या प्रीप्रोसेसर केवल हेडर फाइलों की प्रतिलिपि नहीं करता है जिसमें केवल फ़ंक्शन प्रोटोटाइप होते हैं और वास्तविक स्रोत फ़ाइलों को लिंक समय पर शामिल किया जाता है? उपरोक्त इसे वास्तविक स्रोतों की तरह ध्वनि बनाते हैं, प्रीप्रोसेसर द्वारा चिपकाया जाता है, जो मुझे विश्वास है कि यह मामला नहीं है। दूसरी बात यह है कि मैं पूछूंगा कि जावा में आयात के मामले में क्या होता है जो अलग है? क्या संकलक पैकेज के इस जोड़े को स्वयं करता है? – fayyazkl

+0

@fayyazkl: लिंकर संकलन के परिणामों से संबंधित है। स्रोत (न तो '*। सी 'और न ही' * .h') निर्माण के इस चरण में अब शामिल हैं। – alk

+0

@fayyazkl: जावा के आयात के तरीके के बारे में, आप यहां पढ़ना चाहेंगे: http://stackoverflow.com/questions/12620369/how-java-import-works – alk

6

जावा में, जब आप import उपयोग करते हैं, तो आप या तो आयात:

  • एकल वर्ग: import foo.bar.Baz
  • एक पूर्ण पैकेज: import foo.bar.*
  • एक वर्ग के एक भी स्थिर सदस्य: import static foo.bar.Baz.GRUT
  • कक्षा के प्रत्येक स्थिर सदस्य: import static foo.bar.Baz.*
2

सी/सी ++ #include निर्देश प्री-प्रोसेसिंग चरण में होता है और सादे अंग्रेजी में इसका अर्थ है "इस जगह पर संपूर्ण हेडर फ़ाइल (या यदि आपको पसंद है तो कोई भी टेक्स्ट फ़ाइल) पेस्ट करें जो पैरामीटर के रूप में दिया जाता है"। नए सी ++ मानक में मॉड्यूल (अंततः) होंगे, और जावा के आयात के समान हो सकते हैं या नहीं भी हो सकते हैं (यह निर्भर करता है कि यह कैसे कार्यान्वित किया जा रहा है)। इस सी ++ प्रस्ताव के बारे में अधिक जानकारी: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3347.pdf

जावा 8 मॉड्यूलर प्रोग्रामिंग के लिए भी समर्थन में सुधार करेगा।देखें: http://openjdk.java.net/projects/jigsaw/

+1

'# शामिल है 'संकलन समय पर खुश नहीं है, लेकिन ** पहले ** संकलन के लिए। – alk

+0

मैं इस बारे में विवरण नहीं चाहता था कि सी/सी ++ कंपाइलर स्रोत को कैसे संसाधित करता है, जो पूरी तरह से ऑफ-विषय होगा। क्या आप सहमत हैं? अभी भी टिप्पणी उचित है, तो +1। – DejanLekic

+0

जावा के 'आयात' कथन और सी/सी ++ के '# शामिल 'निर्देश (ओपी द्वारा पूछे जाने वाले प्रश्न) के बीच अंतर खोजने के संदर्भ में मुझे नहीं लगता कि यह ऑफ-विषय है कि सी/सी ++ प्री-प्रोसेसर किसी संकलन या कोड जनरेशन का हिस्सा नहीं है, लेकिन उल्लेख करने के लिए एक आवश्यक तथ्य है। – alk

0

मुझे लगता है कि एक पहलू यह है कि अन्य उत्तर ग के बारे में साफ नहीं हो सकता है,

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

एक हेडर फ़ाइल समेत एक सरल सत्यापन किया जा सकता है, लेकिन स्रोत फ़ाइल नहीं और फ़ंक्शन को आपके कोड से कॉल करना। कोई संकलन त्रुटि नहीं होगी और केवल लिंक समय पर यह शिकायत करेगा कि परिभाषा परिभाषित करने में सक्षम नहीं है।

-2

आमतौर पर सी, सी ++ लैंग को संदर्भित करता है, जहां वे प्लेटफॉर्म आश्रित भाषाओं के हैं और उन्हें सीधे आर्किटेक्चर के मशीन निर्देश सेट पर संकलित, लिंक और लोड करने की आवश्यकता है, लेकिन जहां आयात जावा लैंग को संदर्भित करता है, यह है मंच के स्वतंत्र, जहां यह बाइट कोड उत्पन्न कर सकता है और फिर इसे बाइनरी कोड प्रारूप में व्याख्या किया जा सकता है।

+0

सवाल "सी/सी +" बनाम "जावा" नहीं था। – alk

7

#include<stdio.h> मतलब है, इस फ़ाइल में stdio.h की सामग्री की प्रतिलिपि जबकि import java.util.ArrayList का मतलब है अगर तुम cann't ऊपर उल्लेख आयात स्थान में इस फ़ाइल नज़र में एक वर्ग के हैं। जावा आयात आपकी फ़ाइल के आकार में वृद्धि नहीं करता है, यह केवल कुछ कीस्ट्रोक बचाता है।

+1

धन्यवाद। यही वह था जिसे मैं ढूंढ रहा था। – h8pathak

0

आयात (जावा में) का उपयोग करने के समान है (सी ++ में) - जैसा कि आप समझते हैं कि वे बिल्कुल समान नहीं हैं, लेकिन बहुत समान हैं।

आयात कंपाइलर को इंगित करना है जहां यह वर्तमान वर्ग में उपयोग की जाने वाली कक्षा (या उप पैकेज) पा सकता है।

में शामिल हैं - स्वेन बेहतर यहाँ समझाया - https://stackoverflow.com/a/3739563/135553

संबंधित मुद्दे