2010-10-15 7 views
10

मैंने केवल तभी देखा था कि स्ट्रिंग क्लास का उपयोग करके मेरे प्रोग्राम <string> शीर्षलेख सहित संकलित किए गए थे। यह पता चला है कि <iostream> में <ios_base> शामिल है जो बदले में <string> शामिल है।क्या मुझे एक शीर्षलेख शामिल करना चाहिए जो पहले से ही अन्य शीर्षकों के माध्यम से शामिल है?

क्या यह बुरा अभ्यास है और क्या मुझे स्पष्ट रूप से <string> शामिल करना चाहिए? भले ही यह स्पष्टता का मामला है?

क्या यह मानना ​​सुरक्षित है कि यह <string> हेडर से अधिक पर लागू होता है? शायद यह कार्यान्वयन विशिष्ट है और मानक स्थिति <string> शीर्षलेख <ios_base> और <iostream> के माध्यम से शामिल किया जा सकता है? यह सुनिश्चित करना कि किसी भी सम्मानित और व्यापक रूप से उपयोग किए जाने वाले कार्यान्वयन में <string> शामिल होगा, जो <iostream> पर कॉल प्रदान करता है।

+2

http://en.wikipedia.org/wiki/Incl ude_guard। मानक पुस्तकालय उन्हें है। – Dragontamer5788

+0

यह बहुत सुविधाजनक है क्योंकि मुझे उस सुविधा से लंबे समय तक पेश नहीं किया गया है। धन्यवाद। – aLostMonkey

उत्तर

10

आप स्पष्ट रूप से जो कुछ भी मानक पुस्तकालय हेडर आप की जरूरत को शामिल करना चाहिए।

यह निर्दिष्ट नहीं है कि मानक पुस्तकालय शीर्षलेख अन्य मानक लाइब्रेरी शीर्षकों द्वारा शामिल किए गए हैं, इसलिए ऐसे विवरण कंपाइलर्स के बीच भिन्न होंगे।

एक मामला जहां आप किसी अन्य शीर्षलेख द्वारा शामिल किए गए शीर्षलेख पर भरोसा कर सकते हैं, यदि एक शीर्षलेख में एक वर्ग दूसरे वर्ग में प्राप्त होता है। उदाहरण के लिए, <iostream> में <ios_base> शामिल होना चाहिए क्योंकि <iostream> में परिभाषित कक्षाएं <ios_base> में परिभाषित कक्षाओं से ली गई हैं।

+2

जो कोई भी एक अलग ऑपरेटिंग सिस्टम पर आपके आवेदन को पोर्ट करने के लिए मिलता है या एक अलग कंपाइलर के साथ बनाने के लिए अपने ऐप को अपडेट करता है, तो आप इस मामले में जेम्स मैकनेलिस की सलाह का पालन करते हुए धन्यवाद देंगे। मेरा विश्वास करो, मुझे पिछले हफ्ते में कई शीर्ष लेख लिखना पड़ा है क्योंकि उचित हेडर शामिल नहीं हैं। कुछ अन्य महत्वपूर्ण: memset memory.h में नहीं है, यह एक गैर-मानक माइक्रोसॉफ्टवाद है। एक और उदाहरण: fabs और abs stdlib.h में हैं, गणित नहीं। – George

+3

@ जॉर्ज: 'fabs'' 'में है। 'अभिन्न प्रकार औपचारिक तर्क के लिए abs', जबकि' चल बिन्दु तर्क के लिए abs' '' में है (C++, लेकिन मैं सी में नहीं लगता) '' में है। चीयर्स और एचटी।, –

+0

@ एएलएफ पी। स्टीनबाच: आप fabs के बारे में सही हैं, ओह। पेट केवल सी ++ के लिए अधिभारित है।चूंकि हम एक सी ++ कंपाइलर के बजाय एक सी संकलक के साथ एक ही कोड को संकलित कर रहे थे, इसलिए मुझे एक गुच्छा पेट() को fabs() के साथ कॉल करना और प्रतिस्थापित करना था। जब मैं कैफीन से बाहर हूं तो मुझे पोस्टिंग के लिए यही मिलता है। :) – George

7

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

यदि, आपके कोड को दोबारा सक्रिय करते समय, आप उच्च स्तरीय शामिल फ़ाइलों (उदाहरण के लिए, iostream) में से एक के लिए आवश्यकता को हटाते हैं, यह निर्धारित करने के लिए काफी दर्दनाक हो सकता है कि आपका एप्लिकेशन अब क्यों संकलित नहीं होता है।

+3

+1 आप शब्द उत्तर के लिए मेरे लगभग शब्द से पहले 2 सेकंड पहले सबमिट बटन दबाते हैं। – Anthony

+0

यदि आप अपनी मेकफ़ाइल निर्भरता सटीक होना चाहते हैं, तो शीर्षलेख समेत एक * आवश्यक * और * नहीं होना चाहिए *। – jww

2

यदि आप एक बार फिर से उचित हेडर ('prprma एक बार 'या उचित #ifndef के साथ) जोड़ते हैं, तो यह केवल संकलन करने के लिए थोड़ा और समय जोड़ता है (केवल हेडर फ़ाइल सामग्री को खोलने, पार्स करने और दूर करने के लिए) , लेकिन बहुत गंभीर बात नहीं यह, आपकी फ़ाइलों अधिक संकलित करने के लिए आसान हो जाता है, जबकि हालात बदलना चाहिए (यानी, एक अलग परियोजना के लिए उन्हें स्थानांतरित उनमें से बाहर एक पुस्तकालय बनाने, आदि) आप एक ही # जोड़ने के संकलन समय के बारे में वास्तव में चिंतित हैं ifndef हैडर (हालांकि मैं इसकी सलाह नहीं देते) शामिल करने से पहले

यानी

// header.h 
#ifndef _HEADER_H 
#define _HEADER_H 
int blahblahblah(int); 
#endif 


// cppfile.cpp 
#ifndef _HEADER_H 
#include <header.h> 
#endif 
संबंधित मुद्दे