याद रखें, C / C ++ प्रीप्रोसेसर एक अलग, विशुद्ध रूप से टेक्सुअल, प्रोसेसिंग स्टेप है। #includeशामिल हैडर की सामग्री में निर्देश खींचतान और संकलक यह पार्स करने के लिए है। इसके अलावा, प्रत्येक .cppका संकलन पूरी तरह से अलग है, इसलिए यह B.hसंकलन संकलित करते समय संकलक B.cppको कम से कम तब मदद मिलती है जब उसे संकलन करते समय फिर से इसकी आवश्यकता होती है A.cpp। और फिर से संकलन करते समय C.cpp। और D.cpp। और इसी तरह। और उन फ़ाइलों में से प्रत्येक को फिर से संकलित करना होगा यदि इसमें शामिल किसी भी फ़ाइल को बदल दिया गया है।
तो कहते हैं कि वर्ग Aका उपयोग करता है वर्ग Bऔर वर्गों Cऔर Dउपयोग वर्ग Aहै, लेकिन में हेरफेर करने की जरूरत नहीं है B। यदि कक्षा Aको केवल आगे की घोषणा के साथ घोषित किया जा सकता है B, की तुलना B.hमें दो बार संकलित किया जाता है: जब संकलन B.cppऔर A.cpp(क्योंकि Bअभी भी A'तरीकों के अंदर की जरूरत है )।
लेकिन जब A.hभी शामिल है B.h, यह संकलित किया गया है चार बार-जब संकलन B.cpp, A.cpp, C.cppऔर D.cppबाद में दो अब परोक्ष रूप से शामिल हैं के रूप में B.hभी।
इसके अलावा जब हेडर को एक से अधिक बार शामिल किया जाता है, तो प्रीप्रोसेसर को इसे हर बार पढ़ना होता है । यह गार्डिंग #ifdefएस के कारण इसकी सामग्री को संसाधित करना छोड़ देगा , लेकिन यह अभी भी इसे पढ़ता है और गार्ड के अंत की खोज करने की आवश्यकता है, जिसका अर्थ है कि इसे अंदर सभी पूर्वप्रक्रमक निर्देशों को पार्स करना है।
(जैसा कि अन्य उत्तर में उल्लेख किया गया है, पहले से तैयार हेडर इस के इर्द-गिर्द काम करने का प्रयास करते हैं, लेकिन वे कीड़े की अपनी इच्छा है; मूल रूप से आप सिस्टम हेडर के लिए उनका यथोचित उपयोग कर सकते हैं और केवल तब जब आप उनमें से बहुत से उपयोग नहीं कर रहे हों, लेकिन नहीं आपके प्रोजेक्ट में हेडर)
vehicle.h,bus.h,toybus.h।vehicle.hद्वारा शामिल करेंbus.hऔर द्वाराbus.hशामिल करेंtoybus.h। इसलिए अगर मैं इसमें कुछ बदलाव करता हूंbus.h। संकलक खुला औरvehicle.hफिर से पार्स करता है ? क्या यह इसे फिर से संकलित करता है?