2011-02-14 9 views
15

संभव डुप्लिकेट:
What is a “translation unit” in C++सी ++ में संकलन इकाई कैसे परिभाषित की जाती है?

यह अक्सर कहा जाता है कि स्थैतिक चर घोषित सी में/C++ संकलन इकाइयों में दिखाई नहीं देते हैं? क्या इसका मतलब यह है कि प्रत्येक .c या .cpp फ़ाइल एक अलग संकलन इकाई है? .h फ़ाइल में घोषित एक, एच फ़ाइल और स्थैतिक चर के बारे में क्या? क्या .h फ़ाइल को एक अलग संकलन इकाई के रूप में भी माना जाता है?

+0

संभावित डुप्लिकेट: http://stackoverflow.com/questions/1106149/what-is-a-translation-unit-in-c – Flexo

+6

तकनीकी रूप से एक डुप्लिकेट, लेकिन यह मानता है कि आप जानते हैं कि "संकलन इकाई" एक "संकलन इकाई" है एक "अनुवाद इकाई" के समान। – MSalters

उत्तर

27

शीर्षलेख फ़ाइलों के पास कोई अलग जीवन नहीं है, केवल उनकी सामग्री #included .c या .cpp फ़ाइलों में है। लेकिन चूंकि #include प्रीप्रोसेसर द्वारा संभाला जाता है, इसलिए कंपाइलर को अलग-अलग शीर्षलेख फ़ाइलों के बारे में कोई जानकारी नहीं है; यह केवल परिणामी कोड सूची इनपुट के रूप में देखता है। इसे संकलन इकाई कहा जाता है: प्रासंगिक स्रोत शीर्षकों की सामग्री द्वारा प्रतिस्थापित #include निर्देशों के साथ एक स्रोत फ़ाइल।

+1

इस प्रश्न को डुप्लीकेट के रूप में व्याख्या किया जा सकता है, लेकिन मूल प्रश्न – user9589

+0

के उत्तर से उत्तर अधिक निर्देशक है ... सशर्त प्रीप्रोसेसर निर्देशों द्वारा छोड़ी गई किसी भी पंक्ति को घटाएं। –

4

कंपाइलर केवल स्रोत फ़ाइलों को संसाधित करता है, आमतौर पर एक्सटेंशन .c या .cpp के साथ। कंपाइलर वास्तव में उन फ़ाइलों के बारे में परवाह नहीं करता है जिनमें शामिल हैं: जहां तक ​​संकलक आमतौर पर कार्यान्वित किया जाता है, प्रत्येक .c/.cpp फ़ाइल को संसाधित किया जाता है, जो भी .h फाइलें पढ़ी जाती हैं (प्रीप्रोसेसर की सौजन्य)।

यही कारण है कि हम 'संकलन इकाइयों' के बारे में बात करते हैं: कुछ जो एक बार में संकलित होता है, जिसके परिणाम बाद में निष्पादन योग्य में जुड़ सकते हैं।

8

C और C++ संकलन (आमतौर पर) तीन स्वतंत्र चरणों में बांटा गया है:

  • Preprocessing, स्थूल और # शामिल विस्तार से जुड़े।
  • संकलन, स्रोत कोड को बाइनरी कोड में परिवर्तित करना और intermediante ऑब्जेक्ट फ़ाइलों को उत्पन्न करना।
  • लिंकिंग, ऑब्जेक्ट फ़ाइलों को एक एकल ईएलएफ या EXE फ़ाइल में शामिल करना।

जहां भी #include या मैक्रो है, प्रीप्रोसेसर वास्तविक अभिव्यक्ति के साथ उस अभिव्यक्ति को फैलाता है। #include के मामले में कि पूरी लाइन को .h फ़ाइल सामग्री के साथ प्रतिस्थापित किया गया है।

वास्तविक कंपाइलर (आमतौर पर) किसी भी शीर्षलेख फ़ाइल से अवगत नहीं है, यह एक संकलन इकाई को एक बड़ी .c या .cpp फ़ाइल के रूप में देखता है।

"आमतौर पर" भाग इस तथ्य से आता है कि कुछ कंपाइलर्स कुछ प्रकार के कैश में प्रीकंपील्ड हेडर संग्रहीत करके हेडर समावेशन को अनुकूलित करते हैं, लेकिन प्रभाव समान है।

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