2014-05-14 4 views
6

मैंने सी ++ स्रोत कोड से साझा लाइब्रेरी (.dll) बनाई है।एक डीएलएल पुस्तकालय का उपयोग करते समय, क्या डीएल बनाने के लिए उपयोग किए जाने वाले सभी शीर्षकों को शामिल करना आवश्यक है?

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

(तो वे परोक्ष रूप से कार्यक्रम में भी उपयोग किया जाता है, और यह अजीब हो सकता है अगर उनके शामिल किए जाने आवश्यक नहीं है।)

उत्तर

10

हैडर फ़ाइलें कुछ नहीं जादुई हैं, वे तो बस अपनी .cpp फ़ाइल को सुनिश्चित करने के लिए एक सुविधाजनक तरीका हो इसकी सभी घोषणाओं और परिभाषाओं तक पहुंच है। इसलिए केवल उन सभी को शामिल करें जिन्हें आपको वास्तव में अपनी प्रत्येक फाइल (1) में आवश्यक है।

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

किसी भी अन्य अच्छी तरह से व्यवहार (यानी, वास्तव में उपयोग करने योग्य) डीएलएल की तरह, आपके डीएलएल को सार्वजनिक इंटरफ़ेस हेडर फ़ाइलों का एक सेट प्रदान करना होगा। सामान्य परिस्थितियों में, आपके पास उस DLL का उपयोग करके प्रोग्राम बनाने के लिए इन सभी सार्वजनिक इंटरफ़ेस शीर्षलेख फ़ाइलें उपलब्ध होनी चाहिए। इसका मतलब यह नहीं है कि आपको #include उन सभी को चाहिए; इसके विपरीत, आपको नहीं करना चाहिए। कंपाइलर (प्रीप्रोसेसर, वास्तव में) #include की आवश्यकता होगी।

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

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


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

+0

लेकिन, कई शीर्षलेख उन कार्यों के शीर्षकों में शामिल किए गए हैं जिन्हें मैं कॉल करता हूं (और उनके संबंधित शीर्षलेख को शामिल करता हूं)। उनके बारे में कंपाइलर कैसे जानता है? – user215721

+0

@ उपयोगकर्ता 215721 '# शामिल हैं' डीएलएल की शीर्षलेख फ़ाइलों में 'कथन' किसी अन्य '# शामिल' कथन की तरह हल किया जाएगा। मैं थोड़ा सा जवाब विस्तारित करूंगा, शायद हम "शामिल" शब्द के विभिन्न अर्थों का जिक्र कर रहे हैं। – Angew

+0

बहुत बहुत धन्यवाद। आपकी आखिरी वाक्य ने वास्तव में मुझे जवाब दिया: * बेशक, इसका मतलब है कि एक सार्वजनिक हेडर फ़ाइल कभी भी एक आंतरिक शामिल नहीं हो सकती है। * अब मुझे अपने कई शीर्षलेखों को अपने कोड को प्रतिलिपि बनाकर ' # अन्य लोगों में शामिल है। – user215721

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

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