हमें हेडर फ़ाइल लिखने की आवश्यकता क्यों है?


12

इससे पहले कि आप अपने भद्दे कमेंट को कोड़े मारें, मुझे पता है - यह एक नीच प्रश्न है। C आधारित भाषा का उपयोग करते हुए यह मेरा पहला अवसर है।

मैं मोबाइल विकास पर एक कंप्यूटर विज्ञान पाठ्यक्रम के लिए ऑब्जेक्टिव सी सीखने वाला एक अंडरग्रेजुएट छात्र हूं। मुझे पता है कि, एक अकादमिक सेटिंग में, वास्तविक दुनिया के बहुत सारे विचार आवश्यक नहीं हैं क्योंकि आप छोटी परियोजनाओं का निर्माण कर रहे हैं, छोटी टीमों में काम कर रहे हैं, आदि।

लेकिन हमारे प्रोफेसर मांग करते हैं - और XCode हर .m कार्यान्वयन फ़ाइल के लिए .h शीर्ष लेख फ़ाइलों का समर्थन करता है। मेरे लिए, यह व्यस्त काम की तरह लगता है। मुझे यह सुनिश्चित करना है कि मैं हर विधि हस्ताक्षर और उदाहरण चर को दूसरी फ़ाइल पर कॉपी करूं। यदि मैं एक फ़ाइल बदलता हूं, तो मुझे यह सुनिश्चित करना होगा कि यह दूसरी फ़ाइल के अनुरूप है। ऐसा लगता है जैसे बस छोटी सी झुंझलाहट का एक गुच्छा है।

लेकिन मुझे पता है कि हेडर फ़ाइलों के लिए कुछ वास्तविक दुनिया का उपयोग करना होगा। एक महान जवाब दोनों को संबोधित करेंगे:

  1. एक हेडर फ़ाइल क्या उपयोगी है जिसके लिए कार्यान्वयन फ़ाइल अनुकूल नहीं है? इसका उद्देश्य क्या है?
  2. प्रोग्रामर के रूप में हमें अपनी हेडर फ़ाइलों को मैन्युअल रूप से क्यों लिखना पड़ता है? ऐसा लगता है कि वे आसानी से स्वचालित रूप से उत्पन्न हो सकते हैं।

अग्रिम में धन्यवाद!


क्या XCode स्वचालित रीफ़ैक्टरिंग का समर्थन करता है ताकि यदि आप शीर्ष लेख में हस्ताक्षर बदलते हैं तो यह स्वतः कार्यान्वयन (और इसके विपरीत) के लिए प्रचारित होता है? या हो सकता है कि एक प्लगइन है जो समर्थन करता है? मुझे पता है कि यह मैन्युअल रूप से करने के लिए एक दर्द है।
FrustratedWithFormsDesigner

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

मुझे आश्चर्य है कि ऐसी कार्यक्षमता मौजूद नहीं है। मुझे पता है कि ग्रहण जावा के लिए इस तरह के रीफैक्टरिंग कर सकता है, मुझे नहीं पता कि क्या सी / सी ++ प्लगइन्स हेडर / इम्पैक्ट रीचार्ज कर सकते हैं। मुझे लगता है कि अगर XCode के लिए ऐसा कोई उपकरण मौजूद नहीं है, तो यह विकसित होने लायक कुछ हो सकता है। ;)
FrustratedWithFormsDesigner

जवाबों:


9
  1. संक्षेप में;

    • हेडर फ़ाइल एक मॉड्यूल के लिए एपीआई को परिभाषित करता है। यह एक अनुबंध लिस्टिंग है, जो तीसरे पक्ष को कॉल कर सकती है। मॉड्यूल को तृतीय पक्षों को ब्लैक बॉक्स माना जा सकता है।

    • कार्यान्वयन मॉड्यूल को लागू करता है। यह ब्लैक बॉक्स के अंदर है। एक मॉड्यूल के डेवलपर के रूप में आपको यह लिखना होगा, लेकिन तीसरे पक्ष के मॉड्यूल के उपयोगकर्ता के रूप में आपको कार्यान्वयन के बारे में कुछ भी जानने की आवश्यकता नहीं होनी चाहिए। शीर्ष लेख में आपकी आवश्यक सभी जानकारी होनी चाहिए।

  2. हेडर फ़ाइल के कुछ हिस्से ऑटो जनरेट हो सकते हैं - विधि घोषणाएं। इसके लिए आपको कार्यान्वयन की व्याख्या करने की आवश्यकता होगी क्योंकि कार्यान्वयन में निजी तरीके होने की संभावना है जो एपीआई का हिस्सा नहीं बनते हैं और हेडर में नहीं होते हैं।

हेडर फाइलें कभी-कभी उनमें अन्य जानकारी होती हैं; प्रकार की परिभाषाएँ, निरंतर परिभाषाएँ आदि ये हेडर फ़ाइल में हैं, न कि कार्यान्वयन में।


लेकिन जब कोई ऐसी स्थिति में होगा जहां उन्हें मेरे कोड का उपयोग करने की आवश्यकता होगी, लेकिन केवल .h फ़ाइल तक ही पहुंच थी? क्या उन्हें अभी भी इसे चलाने के लिए .m की आवश्यकता नहीं होगी?
हार्टले ब्रॉडी

1
यदि आप कार्यान्वयन विवरण बदलते हैं, तो मैं सैद्धांतिक स्तर पर अमूर्तता की आवश्यकता को समझता हूं, लेकिन मुझे यकीन नहीं है कि इस तरह की स्थिति उत्पन्न होगी।
हार्टले ब्रॉडी

10
कभी-कभी, आमतौर पर व्यावसायिक कारणों के लिए, आप किसी को अपने कोड का उपयोग करने की अनुमति दे सकते हैं, लेकिन आपके कार्यान्वयन तक पहुंच नहीं है। इस मामले में आप एक हेडर फ़ाइल और या तो लाइब्रेरी या ऑब्जेक्ट कोड प्रदान करेंगे, जो पहले ही संकलित किया जा चुका है।
ल्यूक ग्राहम

हाँ! मैंने देखा। माना जाता था कि कोड पहले से ही संकलित किया जाएगा, इस प्रकार उपयोग करने योग्य है लेकिन पठनीय नहीं है। धन्यवाद!
हार्टले ब्रॉडी

3
इसके अलावा, मैं आपके कोड का उपयोग करने का तरीका जानने के लिए कार्यान्वयन क्यों पढ़ना चाहूंगा? हेडर फ़ाइल को पढ़ने के लिए यह पर्याप्त होना चाहिए।
प्रति जोहानसन

5

एक हेडर का मुख्य कारण #includeइसे किसी अन्य फ़ाइल में सक्षम किया जा सकता है , इसलिए आप उस अन्य फ़ाइल से एक फ़ाइल में फ़ंक्शन का उपयोग कर सकते हैं। हेडर में केवल (केवल) फ़ंक्शन का उपयोग करने में सक्षम होना शामिल है , न कि कार्यों को स्वयं करने में सक्षम है , इसलिए (हमें उम्मीद है) इसे संकलित करना काफी तेज है।

किसी को भी कभी भी एक संपादक को लिखने से अलग से अधिकांश परिणामों को बनाए रखना जो प्रक्रिया को बहुत अच्छी तरह से स्वचालित करता है। वास्तव में बहुत सारे कारण हैं जो वे ऐसा नहीं कर सकते हैं , और कुछ ने भी करने की कोशिश की है - लेकिन संपादकों ने ऐसा किया है और कभी भी बाजार में बहुत अच्छा नहीं किया है, और अधिक मुख्यधारा के संपादकों ने इसे नहीं अपनाया है।


2

हेडर शामिल करने से आपका कोड फ़ंक्शन या विधियों को कॉल करने की अनुमति देता है जो कहीं और लिखे जाते हैं और जो आपके सॉफ़्टवेयर प्रोजेक्ट / बिल्ड का हिस्सा हो सकता है या नहीं, लेकिन जब आप सॉफ़्टवेयर का निर्माण कर रहे हैं तो 'लिंकर' द्वारा पाया जा सकता है।

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

लेकिन आपके कंपाइलर को यह बताने की जरूरत है कि फ़ंक्शन कहीं मौजूद है भले ही वह कोड नहीं देख सकता है और हेडर ऐसा करता है। जब कंपाइलर समाप्त हो जाता है, तो लिंकर को बुलाया जाता है और यह आपके कोड के उन बिट्स को 'लिंक' करता है जो कि झूलने वाले हैं, जैसे लाइब्रेरी कॉल।


1

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

अधिक जानकारी के लिए यह लेख पढ़ें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.