स्पष्ट रूप से टेम्पलेट पुस्तकालयों को केवल शीर्षलेख होना चाहिए, लेकिन गैर-टेम्पलेट्स के लिए, आपको चीजों को केवल हेडर बनाने के लिए कब करना चाहिए?मुझे लाइब्रेरी हेडर बनाने पर विचार कब करना चाहिए?
उत्तर
यदि आपको लगता है कि आपकी गैर-टेम्पलेट लाइब्रेरी केवल हेडर हो सकती है, तो इसे दो फ़ाइलों में विभाजित करने पर विचार करें, फिर एक तीसरी फ़ाइल प्रदान करें जिसमें .h
और .cpp
(एक गार्ड शामिल है) शामिल हैं।
तब कोई भी जो आपके पुस्तकालय का उपयोग कई अलग-अलग टीयू में करता है, और संदेह करता है कि यह बहुत संकलन समय खर्च कर सकता है, आसानी से इसका परीक्षण करने के लिए परिवर्तन कर सकता है।
एक बार जब आप जानते हैं कि उपयोगकर्ताओं के पास लाइब्रेरी का उपयोग करने का विकल्प है, तो उत्तर शायद "जब भी संभव हो तो वह विकल्प प्रदान करें" बन जाता है। इतने सारे समय में कि कई टीयू से इसे शामिल करने से ओडीआर का उल्लंघन नहीं होगा। उदाहरण के लिए, यदि आपके गैर- static
नि: शुल्क फ़ंक्शंस static
ग्लोबल्स का संदर्भ लेते हैं, तो आप भाग्य से बाहर हैं, क्योंकि विभिन्न टीयू में उस फ़ंक्शन की विभिन्न परिभाषाएं उसी नाम से अलग-अलग ऑब्जेक्ट्स का संदर्भ लेंगी, जो एक ओडीआर-उल्लंघन है।
ओह। इस तरह से ऐसा करने के बारे में कभी सोचा नहीं। +1 '.cpp' '# शामिल' होने पर फ़ंक्शन घोषणाओं को 'इनलाइन' पर सही तरीके से सेट करने के लिए कैसे मिलता है? –
@ बिली: तीसरी फ़ाइल (दूसरा। एच) में '# परिभाषित करें 'सेट करें, और .cpp में' #ifdef _____ # परिभाषित करें DO_INLINE इनलाइन #else # परिभाषित करें DO_INLINE # endif'। – Xeo
या उन्हें हमेशा 'इनलाइन' चिह्नित करें, यह कोई नुकसान नहीं करता है। –
टेम्पलेट्स के बिना, आपके पास हेडर में वास्तविक परिभाषाएं होंगी। इसका मतलब है कि यदि दो फाइलों में आपका हेडर शामिल है, तो आपको कई परिभाषाएं मिलेंगी और कोड संकलित नहीं होगा।
दूसरे शब्दों में, हेडर में परिभाषा डालना एक बहुत बुरा विचार है। आपको केवल घोषणाओं और टेम्पलेट्स के साथ रहना चाहिए।
टेम्पलेट्स के लिए, कंपाइलर्स जानते हैं कि आप एक ही शीर्षलेख को एक से अधिक बार शामिल कर सकते हैं, वे एक ही कोड को बार-बार उत्पन्न नहीं करेंगे।
संपादित करें: यदि आपका मतलब है "सब कुछ रेखांकित रखें", मुझे लगता है कि यह एक बहुत ही खराब दृष्टिकोण है। हेडर फाइल पूरी तरह से अपठनीय हो जाती है, और कार्यान्वयन में कोई भी बदलाव आपकी लाइब्रेरी के किसी भी उपयोगकर्ता को सबकुछ पुनः संयोजित करने के लिए मजबूर करता है।
-1: यह सच नहीं है। जब तक उनके पास आंतरिक संबंध होता है तब तक आप शीर्षकों में परिभाषाएं डाल सकते हैं। (उदाहरण के लिए उन्हें 'इनलाइन' घोषित किया गया है) –
'इनलाइन'। 'निफ ने कहा। – Xeo
कभी-कभी, प्रत्येक परिवर्तन के लिए पुन: संकलित करने की आवश्यकता ऐसी सीमा नहीं होती है। –
टेम्पलेट पुस्तकालयों को केवल हेडर होने की आवश्यकता नहीं है: कार्यान्वयन में टेम्पलेट पैरामीटर से स्वतंत्र कुछ टुकड़े हो सकते हैं, और कुछ कारणों से (जैसे कम कोड आकार) विशेष बाइनरी में अलग हो जाते हैं।
मैं ऐसी स्थिति की कल्पना नहीं कर सकता जहां एक गैर-टेम्पलेट लाइब्रेरी वास्तव में केवल हेडर होना चाहिए। हालांकि कभी-कभी यह सभी कोड की इनलाइनिंग की अनुमति देने के लिए उचित प्रदर्शन-वार हो सकता है। एक उदाहरण मंच-विशिष्ट इंटरफेस के आसपास रैपर की लाइब्रेरी हो सकती है, उदा। सिंक्रनाइज़ेशन प्राइमेटिव्स, थ्रेड-लोकल स्टोरेज, प्लेटफॉर्म- और परमाणु संचालन आदि के कंपाइलर-विशिष्ट कार्यान्वयन जैसी चीजों के लिए
एलेक्सी: मुझे एसटीएल की एक लाइब्रेरी दिखाएं जो ** ** ** हेडर-केवल नहीं है। और एसटीएल के साथ, मेरा मतलब कंटेनर/एल्गोरिदम/इटरेटर भाग है, पूरी मानक लाइब्रेरी नहीं। – Xeo
शायद, लेकिन टेम्पलेट पुस्तकालयों के टेम्पलेट भागों केवल शीर्षलेख होना चाहिए। अनुवाद इकाई में एक टेम्पलेट परिभाषा मौजूद होने की आवश्यकता है ताकि संकलक इसे तुरंत चालू कर सके। कुछ एसटीएल में अधिकांशतः द्विआधारी भाग होते हैं क्योंकि या तो ए को सामान्य सी ++ रनटाइम के हिस्से के रूप में शामिल किया जाता है जिसमें टुकड़े टुकड़े नहीं होते हैं (उदा। 'Libstdcxx'), या बी। वे घटक होते हैं जो टेम्पलेट नहीं होते हैं। प्रदर्शन की बात के लिए, आजकल अधिकांश कंपाइलर्स में लिंक टाइम कोड पीढ़ी होती है जो रिलीज बिल्ड के लिए दोनों के बीच प्रदर्शन अंतर को काफी दूर करती है। –
@Xeo: ठीक है, आप शायद सही हैं, एसटीएल भाषा समर्थन पुस्तकालय के समान नहीं है। –
आप Boost.Asio लीड का पालन कर सकते हैं।
वे पुस्तकालयों के दो संस्करण प्रदान करते हैं: हेडर-केवल और हेडर + लाइब्रेरी।
वे अपने शीर्षकों को शामिल करने से पहले परिभाषित (या नहीं) एक एकल मैक्रो के साथ करते हैं। मुझे लगता है कि डिफ़ॉल्ट (यदि परिभाषित नहीं किया गया है) हेडर-केवल संस्करण का उपयोग करना है।
Optional Separate Compilation देखें।
ध्यान दें कि वे कैसे एक ही स्रोत फ़ाइल को संकलित करने के लिए अच्छी तरह से प्रदान करते हैं जो गतिशील रूप से लोड की गई लाइब्रेरी के विरुद्ध सब कुछ या विकल्प को परिभाषित करने के विकल्प को परिभाषित करता है।
- 1. मुझे कब और क्यों एएसपीएनटी एमवीसी पर विचार करना चाहिए?
- 2. मुझे जावास्क्रिप्ट फ्रेमवर्क लाइब्रेरी का उपयोग कब करना चाहिए?
- 3. सी # मुझे सूची का उपयोग कब करना चाहिए और मुझे सरणीसूची का उपयोग कब करना चाहिए?
- 4. मुझे एक वादा कब अस्वीकार करना चाहिए?
- 5. मुझे CompiledQuery का उपयोग कब करना चाहिए?
- 6. मुझे _aligned_malloc() का उपयोग कब करना चाहिए?
- 7. मुझे कब लागू करना चाहिए __call__
- 8. मुझे ConcurrentSkipListMap का उपयोग कब करना चाहिए?
- 9. मुझे IDISposable कब लागू करना चाहिए?
- 10. मुझे सेफफोर्स का उपयोग कब करना चाहिए?
- 11. मुझे GC.SuppressFinalize() का उपयोग कब करना चाहिए?
- 12. मुझे डीबी कनेक्शन कब बंद करना चाहिए?
- 13. मुझे पैरामीटर का उपयोग कब करना चाहिए?
- 14. मुझे स्क्लेक्लेमी पर फ्लश() कब कॉल करना चाहिए?
- 15. स्क्रैच से वेबसाइट बनाने पर मुझे सीएमएस का उपयोग कब करना चाहिए?
- 16. त्रुटि बनाने पर, क्या मुझे 'नया' प्रस्तुत करना चाहिए या 'नया' पर रीडायरेक्ट करना चाहिए?
- 17. मुझे ओरेकल की इंडेक्स संगठित तालिका का उपयोग कब करना चाहिए? या, मुझे कब नहीं चाहिए?
- 18. सत्र कार्यान्वयन चुनते समय मुझे क्या विचार करना चाहिए?
- 19. अलगाव स्तर - Serializable। मुझे इसका उपयोग कब करना चाहिए?
- 20. मुझे डोमेन विशिष्ट भाषा का उपयोग कब करना चाहिए?
- 21. जावास्क्रिप्ट का विकास - मुझे यूनिट परीक्षण कब शुरू करना चाहिए?
- 22. मुझे MySQL संपीड़ित प्रोटोकॉल का उपयोग कब करना चाहिए?
- 23. मुझे std_logic_vector का उपयोग कब करना चाहिए और मुझे अन्य डेटा प्रकारों का उपयोग कब करना चाहिए?
- 24. मुझे .NET में अपनी ऑब्जेक्ट्स का निपटान कब करना चाहिए?
- 25. मुझे स्कैला की @inline एनोटेशन का उपयोग कब करना चाहिए (और मुझे नहीं चाहिए)?
- 26. मुझे make_heap बनाम प्राथमिकता कतार का उपयोग कब करना चाहिए?
- 27. उद्देश्य-सी में, मुझे कक्षा विधियों का उपयोग कब करना चाहिए और मुझे उदाहरण विधियों का उपयोग कब करना चाहिए?
- 28. मुझे अपाचे कॉमन्स 'Validate.isTrue का उपयोग कब करना चाहिए, और मुझे केवल' assert 'कीवर्ड का उपयोग कब करना चाहिए?
- 29. मुझे ऑब्जेक्ट डेटाबेस का उपयोग कब करना चाहिए?
- 30. मुझे निहित कास्टिंग का उपयोग कब करना चाहिए?
जब आप अपने आईपी को उजागर नहीं करते हैं। – Nim
@Nim: यह बूस्ट सॉफ्टवेयर लाइसेंस के तहत एक ओपन-सोर्स प्रोग्राम है, इसलिए मुझे निश्चित रूप से कोई फर्क नहीं पड़ता। :) –
@ बिली: ओह, आप बूस्ट में गए? Gratz? : पी – Xeo