2010-03-22 15 views
6

संकलन (विशेष रूप से सी ++) के साथ समस्याओं के बारे में कई सवाल पढ़ने और देख कई मामलों में समस्या एक लापता हैडर # शामिल है उसके बाद। मैं अपनी अज्ञानता में आश्चर्यचकित होने में मदद नहीं कर सकता था और खुद से पूछता हूं (और अब आप को):# शामिल हेडर/C++

गायब हेडर स्वचालित रूप से क्यों चेक नहीं किए जाते हैं और प्रोग्रामर को जोड़ा या अनुरोध किया जाता है?

इस तरह की सुविधा उदाहरण के लिए Netbeans में जावा आयात बयान के लिए उपलब्ध है।

+4

क्या जावा हेडर फाइलों के साथ काम करता है? – Peter

+0

उन्हें आयात विवरण कहा जाता है – bragboy

+2

जावा का 'आयात' सी ++ का उपयोग कर रहा है, जैसा कि' # शामिल 'की तरह नहीं है। – fredoverflow

उत्तर

12

java.util.Date और java.sql.Date के बीच जावा में संघर्ष याद रखें? अगर कोई अपने कोड में Date का उपयोग करता है, तो आप यह नहीं बता सकते कि वे import java.util.Date या import java.sql.Date भूल गए हैं या नहीं।

जावा और सी ++ दोनों में, निश्चित रूप से यह बताना संभव नहीं है कि आयात/शामिल कथन क्या गुम है। तो न तो भाषा कोशिश करता है। आपका आईडीई आपके कोड में उपयोग किए गए अविकसित प्रतीकों के लिए सुझाव दे सकता है।

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

सी ++ आईडीई के लिए सामान्य रूप से यह संभव नहीं है कि हेडर निर्भरता "गारंटीकृत" है या केवल एक आकस्मिक कार्यान्वयन विवरण है जिसे उपयोगकर्ताओं पर भरोसा नहीं करना चाहिए। स्पष्ट रूप से मानक पुस्तकालयों के लिए यह केवल यह जान सकता है कि क्या शीर्षकों में परिभाषित किया गया है, लेकिन जैसे ही आप तीसरे पक्ष के पुस्तकालयों में जाते हैं, यह काफी अनिश्चित हो जाता है।

मुझे लगता है कि अधिकांश सी ++ प्रोग्रामर को यह देखने की उम्मीद है कि कौन से शीर्षलेख परिभाषित करते हैं। जावा के साथ, एक-सार्वजनिक-वर्ग-प्रति-फ़ाइल नियम यह काफी सरल बनाता है, और आप केवल इच्छित संकुल/कक्षाएं आयात करते हैं। सी ++ में पैकेज नहीं हैं, और आईडीई के लिए my_namespace::something::MyClass नामक कक्षा को खोजने का एकमात्र तरीका यह है कि प्रत्येक हेडर फ़ाइल में इसकी खोज करें।

+0

आपके लिए स्पष्टीकरण स्टीव – Carlos

0

नेटबीन्स एक आईडीई (एकीकृत विकास पर्यावरण) है। कुछ सी/सी ++ आईडीई में यह सुविधा होती है ... लेकिन हर कोई इसके बारे में नहीं जानता या इसका उपयोग नहीं करता है।

2

क्योंकि दूसरे कंप्यूटर पर आप भरोसा करते हैं आपके लिए सोचें, आपके पास अपने हाथों पर स्काईनेट का एक बड़ा मामला है।

कंप्यूटर, सामान्य रूप से, बहुत सरल लोगों को छोड़कर, विकल्प बनाने में बहुत खराब होते हैं। निर्भरता नरक से कुछ खींचना बस एक ऐसा काम नहीं है जिसे आपको सौंपना चाहिए, क्योंकि उस तरह की सोच मैला कोडिंग और छोटी गाड़ी कोड की ओर ले जाती है।

4

आखिरकार मुझे याद है, अगर कोई आयात कथन मिस हो जाता है तो जावा भी त्रुटि फेंकता है। यह नेटबीन जीयूआई है जो आपके जीवन को आसान बनाता है।

शायद आपको अपने सी/सी ++ कोड के लिए एक बुद्धिमान जीयूआई खोजने का प्रयास करना चाहिए।

7

गायब हेडर स्वचालित रूप से क्यों चेक नहीं किए जाते हैं और प्रोग्रामर को जोड़ा या अनुरोध किया जाता है?

लेकिन वे स्वचालित रूप से जाँच कर रहे हैं।

  1. मेरा कंपाइलर संकलन विफल रहता है जब यह शीर्षलेख नहीं ढूंढता है।
  2. मेरे आईडीई (ग्रहण), एक दृश्य सुराग जब यह एक हेडर फाइल मैं #included गए हैं नहीं मिल सकता है कहते हैं यह # शामिल लाइन को रेखांकित करता है और मुझे बताए कि समस्या क्या है एक टूलटिप प्रदान करता है।

यह स्वचालित रूप से शामिल नहीं होगा क्योंकि यह नहीं पता कि मैं कौन सा भूल गया हूं। कंपाइलर मानसिक नहीं हैं।

0

क्योंकि सामान्य रूप में यह एक कठिन समस्या को पता है जो हेडर फाइल आप कुछ ठीक से परिभाषित करने के लिए शामिल करने की ज़रूरत है। यह बहुत अच्छी सुविधा होगी कि आपका आईडीई सरल मामलों का अनुमान लगाने में सक्षम हो और हालांकि मदद करने के लिए पेशकश करें।

1

कंपाइलर को आपके लिए सोचना नहीं चाहिए। क्या होगा यदि दो अलग-अलग पुस्तकालयों में एक ही नाम का एक कार्य है? यह कैसे पता चलेगा कि कौन सा शीर्षलेख शामिल करना है और कौन सी लाइब्रेरी के खिलाफ लिंक करना है? एक कंपाइलर या आईडीई चुपचाप अपने मैला कोड को ठीक करने के बाद मेरी राय में एक बुरा विचार है।

1

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

सी या सी ++ में, जो नाम आप हेडर को देते हैं उसे आवश्यक रूप से सामग्री से मेल नहीं करना पड़ेगा। यदि आप बुरी तरह से चाहते थे, तो आप अपने शीर्षलेख 1.h, 2.h, 3.h, और इसी तरह - या यहां तक ​​कि 1.bas, 2.pas, 3.java, 4.ada, और जो भी अन्य नाम दे सकते हैं भ्रामक नाम जो आप पसंद करते हैं। यह स्पष्ट रूप से एक गरीब विचार है, लेकिन यदि आपने इसे वैसे भी किया है, तो संकलक बिल्कुल परेशान नहीं होंगे।

इस तरह, सी या सी ++ उपकरण के लिए यह अनुमान लगाने के लिए और अधिक कठिन है कि किसी विशेष प्रकार की परिभाषा प्राप्त करने के लिए किस शीर्षलेख को शामिल करने की आवश्यकता है। सिद्धांत रूप में, यह (उदाहरण के लिए) आपके द्वारा लिखे गए सभी शीर्षकों में सभी कार्यों, वर्गों, प्रकारों आदि का एक बड़ा डेटाबेस बना सकता है, और जब आप एक का उपयोग करते हैं, तो आपको बताएं कि कौन से शीर्षलेख परिभाषित करते हैं , लेकिन मुझे एक आईडीई के बारे में पता नहीं है जो वास्तव में ऐसा करता है।

2

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

जावा के विपरीत, सी ++ वास्तव में किसी भी फाइल को "विशेष" नहीं मानता है। जावा में इसकी विशाल (ब्लोटेड) क्लास लाइब्रेरी है, जिसे प्रोग्रामर के लिए स्वचालित रूप से सुलभ बनाया जाता है।

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

यदि मानक लाइब्रेरी फ़ाइल ढूंढने के लिए ऐसा होता है, तो इसका उपयोग किया जाएगा। यदि किसी तृतीय-पक्ष फ़ाइल को ढूंढना होता है, तो वह इसका उपयोग करेगा।

संकलक पता नहीं है कि sqrt हैडर math.h में परिभाषित किया गया है। या यह भी आमतौर पर cmath में परिभाषित किया गया है वास्तव में, शीर्षलेख द्वारा परिभाषित कार्यों भिन्न हो सकते हैं। शायद, यदि मैं उपयुक्त प्रीप्रोसेसर प्रतीक परिभाषित करता हूं, तो कुछ फ़ंक्शंस एक विशिष्ट शीर्षलेख से हटा दिए जाएंगे, और अन्य सक्षम होंगे।

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

तो सी ++ कंपाइलर अनुमान लगा सकता है कि आपके द्वारा अभी उपयोग किए गए फ़ंक्शन को परिभाषित करने के लिए कौन सा शीर्षलेख शामिल किया जाना चाहिए।

+0

धन्यवाद दोस्त जो बहुत समझ में आता है – Carlos

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