2014-10-28 8 views
17

क्या मुझे प्रत्येक शीर्षलेख को शामिल करना चाहिए, भले ही इसे पहले शामिल किया गया हो? या शायद मैं इसे टालना चाहिए जब मैं कर सकता हूँ? उदाहरण के लिए । अगर मैं कुछ फाइलों में std::string और std::vector का उपयोग करता हूं। यदि <string> में <vector> शामिल हैं तो मुझे केवल <string> या <string> और <vector> शामिल करना चाहिए?क्या मुझे हर शीर्षलेख शामिल करना चाहिए?

+0

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

+14

मैं "आप जो भी उपयोग करते हैं उसे शामिल करें" के पक्ष में हूं। शायद आपको 'वेक्टर' शामिल करने की आवश्यकता नहीं हो सकती है क्योंकि दूसरे में शामिल हैं। लेकिन यह भविष्य में बदल सकता है। – tgmath

+0

आपको उन सभी शीर्षलेख फ़ाइलों को शामिल करना चाहिए जिन्हें आपको शामिल करने की आवश्यकता है, लेकिन उससे अधिक नहीं। अगर मैं '' ' – Barry

उत्तर

29

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

सी ++ मानक पुस्तकालय <string><vector> में और इसके विपरीत में शामिल करने का जिक्र नहीं करता है। इस तरह की कार्यक्षमता का उपयोग करने की कोशिश करने से कोड को एक विशिष्ट कार्यान्वयन में सीमित कर दिया जाएगा। आम तौर पर, मानक लाइब्रेरी शीर्षलेख अन्य शीर्षलेख (या उनके स्वयं के आंतरिक शीर्षलेख) को अनिर्दिष्ट आदेश या तरीके से में शामिल या शामिल नहीं कर सकते हैं। एक उल्लेखनीय अपवाद <initializer_list> है जिसे few of the other standard headers में शामिल करने की आवश्यकता है। इस अनिर्दिष्ट आदेश या तरीके में परिवर्तन भी हो सकते हैं, इस प्रकार अद्यतन संकलक या अद्यतन मानक लाइब्रेरी कार्यान्वयन के साथ पहले संकलित कोड को तोड़ना (यह होने के लिए जाना जाता है)

यह भी मान लें कि यदि हेडर फ़ाइल कक्षा के लिए परिभाषा है, तो इसमें उस वर्ग की परिभाषा के लिए आवश्यक क्या शामिल होना चाहिए। संबंधित .cpp में इसके संबंधित .h और कक्षा को लागू करने के लिए आवश्यक शेष फ़ाइलों को शामिल करना चाहिए। इसकी आवश्यकता नहीं है, इसे शामिल न करें; आवश्यक से अधिक शामिल न करें (llvm style guide)। यहां एक अपवाद templates (that don't have an associated .cpp) है; यह अपवाद अन्य शीर्षलेख केवल कार्यान्वयन पर लागू होगा।

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

कुछ प्रगति w.r.t. प्रतीत होता है। इस संबंध में उपकरण, जैसे कि iwyu project, जो क्लैंग टूल श्रृंखला का उपयोग करता है और ऐसा लगता है कि एमएसवीसी के लिए भी समर्थन है।

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

+9

आप यह भी उल्लेख कर सकते हैं कि किसी की अपनी सी ++ फाइलों के लिए, इंटरफ़ेस '.h' फ़ाइल में केवल इंटरफ़ेस के लिए उपयोग किए जाने वाले शीर्षलेख शामिल होना चाहिए, लेकिन '.cpp' फ़ाइल में कार्यान्वयन में कार्यान्वयन के लिए अतिरिक्त रूप से आवश्यक सब कुछ शामिल होगा। – Edward

+3

मैं सिद्धांत में इस भावना से सहमत हूं। दुर्भाग्यवश, यदि आप पर्ची करते हैं तो इसका पता लगाना काफी मुश्किल है। – dlf

+0

@ डीएलएफ। यह सच है। मैं भी अनुशासन से दूर हो गया है। मुझे यकीन नहीं है कि इन चीजों की जांच करने के लिए टूलिंग में से कुछ कैसे बदल रहे हैं। कभी-कभी मुझे वापस जाने और अपना कोड ऑडिट करने की आवश्यकता होती है। – Niall

8

आम तौर पर, आपको कार्यान्वयन के हिस्से के रूप में हेडर निर्भरताओं का इलाज करना चाहिए, इंटरफ़ेस के हिस्से के रूप में नहीं।

आपको अन्य शीर्षकों सहित शीर्षकों पर भरोसा नहीं करना चाहिए। यदि आपकी कक्षा को std::vector का उपयोग करने की आवश्यकता है, तो <vector> शामिल करें; अगर आपको std::string की आवश्यकता है, तो <string> शामिल करें। अन्यथा आप अप्रत्याशित टूटने के लिए स्वयं को सेट करते हैं जब हेडर जो फ़ाइल को शामिल करते थे, अचानक इसमें शामिल हो जाते थे, क्योंकि उन्हें अब इसकी आवश्यकता नहीं होती है।

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