2010-03-20 40 views
7

में C++ फ़ंक्शन को कब रखना है, मैं बूस्ट और कई अन्य सी ++ पुस्तकालयों को देख रहा हूं। बूस्ट का विशाल बहुमत हेडर फाइलों में लागू किया गया है।हेडर फ़ाइल

मेरे सवाल यह है: के तहत किन स्थितियों आप (बूस्ट) की तरह एक हैडर-केवल कार्यान्वयन करते हो या यह भी एक .cpp फ़ाइल में शामिल हैं?

उत्तर

7

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

यदि आप किसी अन्य अनुवाद इकाई से इनलाइन फ़ंक्शन का उपयोग करना चाहते हैं तो वही लागू होता है।

नहीं तो आप निर्भरता कम करने के लिए एक अलग .cpp फ़ाइल में कार्यान्वयन रखना चाहिए।

+2

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

+0

@STingRaySC हाँ, मुझे सी ++ टेम्पलेट्स से कुछ अस्पष्ट यादें थीं, लेकिन यह संभव है, हालांकि मैंने इसे कभी नहीं किया है। हालांकि, मैंने अंगूठे का नियम देने की कोशिश की जो स्टार्टर्स के लिए अच्छा है और लगभग हमेशा लागू होता है। विशेष मामलों में जाना विशेषज्ञों के लिए है (जिनमें से मैं एक नहीं हूं :-) –

+0

और यदि आपका कंपाइलर 'निर्यात' – smerlin

3

इस मुद्दे को समझना कैसे समझ सी ++ संकलन इकाइयों काम के बारे में मूल रूप से है। शीर्षलेख फ़ाइलों में चीजें मूल रूप से #include कथन द्वारा संकलन इकाइयों के पूरे समूह के स्रोत कोड में चिपकाई जाती हैं। प्रत्येक संकलन इकाई को ऑब्जेक्ट फ़ाइल में संकलित किया जाता है, ऑब्जेक्ट फाइलें लिंक हो जाती हैं, और आपको उस जगह की जगहों पर दोहराने के कारण संघर्ष मिलते हैं।

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

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

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

+0

वास्तव में, लिंकर्स 'टेम्पलेट' instanciations के बारे में स्मार्ट नहीं हैं। वे मूल रूप से पहली बार मुठभेड़ करेंगे और ** ओडीआर ** (एक परिभाषा नियम) पर भरोसा करेंगे। अगर 'Foo ' का केवल एक हिस्सा ही विशेषज्ञता का उपयोग करता है तो बग खोजने में कठिनाई हो सकती है! –

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