यह उन "कोडों" के बजाय "मानक" प्रकारों में से एक है जो कोडिंग मानकों के अनुसार हैं। इसका कारण यह है कि आपको इसे लागू करने के लिए C ++ पार्सर लिखना बहुत पसंद होगा।
हेडर फ़ाइलों के लिए एक बहुत ही सामान्य नियम यह है कि उन्हें अपने आप खड़ा होना चाहिए। हेडर फ़ाइल की आवश्यकता नहीं होनी चाहिए कि कुछ अन्य हेडर फ़ाइलों को प्रश्न में हेडर शामिल करने से पहले #included किया जाए। यह एक परीक्षण योग्य आवश्यकता है। कुछ यादृच्छिक शीर्षकों को देखते हुए foo.hh
, निम्नलिखित को संकलित और चलाना चाहिए:
#include "foo.hh"
int main () {
return 0;
}
इस नियम के कुछ हेडर में अन्य वर्गों के उपयोग के संबंध में परिणाम हैं। कभी-कभी उन परिणामों को आगे उन अन्य वर्गों की घोषणा करके टाला जा सकता है। यह बहुत सारे मानक पुस्तकालय वर्गों के साथ संभव नहीं है। कोई आगे का रास्ता जैसे एक टेम्पलेट इन्स्टेन्शियशन घोषित करने के लिए है std::string
या std::vector<SomeType>
। आपको #include
शीर्षलेख में उन एसटीएल हेडर के पास होना चाहिए, भले ही प्रकार का एकमात्र उपयोग किसी फ़ंक्शन के तर्क के रूप में हो।
एक और समस्या सामान के साथ है जिसे आप संयोग से घसीटते हैं। उदाहरण: निम्नलिखित पर विचार करें:
फ़ाइल foo.cc:
#include "foo.hh"
#include "bar.hh"
void Foo::Foo () : bar() { /* body elided */ }
void Foo::do_something (int item) {
...
bar.add_item (item);
...
}
यहाँ bar
एक वर्ग Foo
डेटा सदस्य है जो टाइप का है Bar
। आपने यहाँ सही काम किया है और बार-बार # निकाह किया है, भले ही उसे हैडर में शामिल किया गया होगा जो वर्ग को परिभाषित करता है Foo
। हालाँकि, आपने उपयोग किए गए सामान को शामिल नहीं किया है Bar::Bar()
और Bar::add_item(int)
। ऐसे कई मामले हैं जहां इन कॉलों के परिणामस्वरूप अतिरिक्त बाहरी संदर्भ हो सकते हैं।
यदि आप foo.o
इस तरह के एक उपकरण के साथ विश्लेषण करते हैं nm
, तो यह दिखाई देगा कि फ़ंक्शन foo.cc
सभी प्रकार के सामान को कॉल कर रहे हैं जिसके लिए आपने उपयुक्त नहीं किया है #include
। तो क्या आपको #include
उन आकस्मिक बाहरी संदर्भों के लिए निर्देश जोड़ना चाहिए foo.cc
? जवाब बिल्कुल नहीं है। समस्या यह है कि उन कार्यों को अलग करना बहुत कठिन है जिन्हें संयोग से सीधे कहा जाता है।