2010-10-19 12 views
10

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

namespace fancy_schmancy 
{ 
    inline void my_fn() 
    { 
    // magic happens 
    } 
}; 
+0

क्या आप गार्ड शामिल कर रहे हैं? संपादित करें: सैम उत्तर पर एक नज़र डालें – smerlin

+0

@ स्मारक: सैम उत्तर पर टिप्पणियों पर नज़र डालें। – GManNickG

उत्तर

21

अपने कार्यों inline घोषित, और उन्हें एक नाम स्थान में डाल दिया है ताकि आप टकराने नहीं है , जो लगभग हमेशा ही शीर्षलेख होते हैं।

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

+0

लेकिन, क्या यह ** प्रकृति के बावजूद ** ** ** सभी ** फ़ंक्शंस 'इनलाइन' बनाने की अनुशंसा की जाती है? मैंने सोचा कि केवल "लघु" फ़ंक्शन 'इनलाइन' होना चाहिए। – Arun

+5

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

+0

"समय-समय पर माइक्रो-ऑप्टिमाइज़ेशन सभी बुराइयों की जड़ है" यह पहला कारण है कि दिमाग में आने वाली इनलाइन नहीं है। –

2

बूस्ट का उपयोग करता हेडर सिर्फ इसलिए एसटीएल की तरह एक बहुत पुस्तकालयों, यह ज्यादातर बनाया गया है:

0

कई सचमुच हेडर-केवल बूस्ट पुस्तकालय हैं, लेकिन वे बहुत ही सरल (और/या केवल टेम्पलेट्स) होते हैं। बड़ी पुस्तकालय कुछ चालबाजी के माध्यम से एक ही प्रभाव को पूरा करते हैं: उनके पास "स्वचालित लिंकिंग" है (आप इस शब्द को here का उपयोग करेंगे)। वे अनिवार्य रूप से शीर्षकों में प्रीप्रोसेसर निर्देशों का एक गुच्छा रखते हैं जो आपके प्लेटफ़ॉर्म के लिए उपयुक्त lib फ़ाइल का पता लगाते हैं और लिंकर को लिंक करने के निर्देश देने के लिए #pragma का उपयोग करते हैं। इसलिए आपको इसे स्पष्ट रूप से लिंक करने की आवश्यकता नहीं है, लेकिन यह अभी भी है जुड़े हुए।

+0

आप g ++ में स्वचालित लिंकिंग चीज़ का उपयोग कैसे करते हैं? मैं एमएसवीसी ++ में जानता हूं कि आप '#pragma (lib," blah.lib ") का उपयोग कर सकते हैं, लेकिन आप g ++ के साथ ऐसा कैसे करते हैं? – Epro

+0

@Epro: मुझे डर है कि मुझे नहीं पता कि यह कैसे किया जाता है। आपको बूस्ट स्रोत को देखना पड़ सकता है। – rmeador

5

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

एक परिभाषा नियम (ओडीआर) के आसपास एक और तरीका inline फ़ंक्शंस का उपयोग करना है। दरअसल, ओडीआर से फ्री-पास प्राप्त करना inline वास्तव में करता है - तथ्य यह है कि यह फ़ंक्शन इनलाइन कर सकता है वास्तव में एक वैकल्पिक दुष्प्रभाव का अधिक है।

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

+0

खैर, बूस्ट डॉक्स एक लाइब्रेरी की अधिकांश हेडर-केवल प्रकृति को एक फीचर के रूप में बताता है। और यह केवल वही सामान है जो उचित रूप से केवल शीर्षलेख नहीं हो सकता है (उदा। रेगेक्सपी सामान में ओएस निर्भरताएं हैं) जो केवल शीर्षलेख नहीं है। इसलिए जब कुछ सब-लाइब्रेरी निस्संदेह हेडर हैं क्योंकि वे टेम्पलेट कोड हैं, तो कम से कम बूस्ट के अनुसार, संपूर्ण रूप से बूस्ट करने का कारण बताएं। –

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