याद रखें, 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
फिर से पार्स करता है ? क्या यह इसे फिर से संकलित करता है?