C ++ में "ट्रांसलेशन यूनिट" क्या है


236

मैं उस समय पढ़ रहा हूं जब मेयर्स द्वारा लिखित "प्रभावी सी ++" और "अनुवाद इकाई" शब्द के पार आया था।

क्या कोई मुझे इसका विवरण दे सकता है:

1) यह वास्तव में क्या है

2) C ++ के साथ प्रोग्रामिंग करते समय मुझे इसका उपयोग करने पर विचार करना चाहिए

3) यदि यह केवल C ++ से संबंधित है, या इसका उपयोग अन्य प्रोग्रामिंग भाषाओं के साथ किया जा सकता है

मैं पहले से ही शब्द का उपयोग किए बिना इसका उपयोग कर सकता हूं ...।


1
2. यदि आपने हेडर फ़ाइलों को शामिल किया है तो आप पहले से ही अनुवाद इकाई का उपयोग कर रहे हैं। यह एक शब्द है जिसका उपयोग संदर्भ के लिए किया जाता है न कि प्रति c ++ कंस्ट्रक्शन के लिए
कहानी

जवाबों:


268

से यहाँ : ( वेबैक मशीन लिंक )

के अनुसार मानक सी ++ ( वेबैक मशीन लिंक ): एक अनुवाद इकाई C ++ में संकलन की बुनियादी इकाई है। इसमें एकल स्रोत फ़ाइल की सामग्री शामिल है, साथ ही किसी भी हेडर फ़ाइलों की सामग्री को प्रत्यक्ष या अप्रत्यक्ष रूप से इसमें शामिल किया गया है, उन पंक्तियों को शून्य करता है जिन्हें सशर्त प्रीप्रोसेसिंग बयानों का उपयोग करके अनदेखा किया गया था।

एक एकल अनुवाद इकाई को ऑब्जेक्ट फ़ाइल, लाइब्रेरी या निष्पादन योग्य कार्यक्रम में संकलित किया जा सकता है।

अनुवाद इकाई की धारणा को अक्सर वन डेफिनिशन नियम, और टेम्प्लेट के संदर्भों में उल्लिखित किया जाता है।


9
क्या शब्द का उपयोग केवल C / C ++ में किया जाता है?
देकुश्रूब

2
@dekuShrub तथ्य की बात के रूप में, नहीं। उदाहरण के लिए, रस्ट में, एक अनुवाद इकाई एक टोकरा है, सी ++ में एक ही चीज को संपूर्ण पुस्तकालय के रूप में संदर्भित किया जाएगा। यह शब्द सार्वभौमिक है, लेकिन यह निश्चित रूप से सी के साथ शुरू हुआ
साहसाहे 18

नया संदर्भ जो बताता है कि यह उत्तर क्या है: en.wikipedia.org/wiki/Translation_unit_(programming)
गेब्रियल स्टेपल्स

67

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

http://msdn.microsoft.com/en-us/library/bxss3ska%28VS.80%29.aspx


3
जिनमें हेडर फाइलें शामिल हैं। हेडर फ़ाइलों को संकलक द्वारा संसाधित किया जाता है, भले ही कोई कोड उत्पन्न न हो। जेफ़एच की प्रीप्रोसेसर टिप्पणी भी देखें, "कंपाइलर सब कुछ देखता है" की परिभाषा एक अच्छी है।
मार्को वैन डे वोर्ट

10
आप ".h" में समाप्त होने वाली फाइलों को ठीक से संकलित कर सकते हैं। फ़ाइल-नाम महत्वपूर्ण नहीं है। सामग्री है यदि "foo.h" की सामग्री "int main () {}" है, तो आप इसे संकलित कर सकते हैं।
जोहान्स स्काउब -

@LightnessRacesinOrbit: हाँ, जो मैं कहना चाह रहा था कि यह अप्रत्यक्ष रूप से एक हेडर को सीधे टीयू के रूप में संकलित करने के बजाय अप्रत्यक्ष रूप से एक टीयू में शामिल करने के माध्यम से संकलित करने के लिए है। दूसरे को हमारे नए संदर्भ देने के लिए रखते हुए, पहली टिप्पणी को गलत होने के लिए हटा दिया।
GMANNICKG 20

1
@GManNickG: कैसे के बारे में ".h फ़ाइलें पारंपरिक रूप से सीधे संकलक को नहीं खिलाई जाती हैं।"
लाइटनेस दौड़

@ जोहान्सचैब-लिट मुझे लगता है कि आप लिंक का मतलब है, संकलन नहीं। आप किसी भी फाइल को तब तक संकलित कर सकते हैं, जब तक कि वह उचित C / C ++ हो, जिसमें सभी नाम परिभाषित हों। हेडर फ़ाइल को संकलित करना बेकार होगा क्योंकि हेडर फ़ाइल के पूरे बिंदु को स्रोत फ़ाइलों में शामिल (कॉपी किया हुआ) पढ़ा जाना है, इसलिए जब आप किसी स्रोत फ़ाइल को संकलित करते हैं, तो वे पहले ही संकलित हो जाती हैं। मुझे लगता है कि आपके कहने का मतलब यह है कि आप एक फ़ाइल से एक निष्पादन योग्य नहीं बना सकते हैं जिसमें एक मुख्य कार्य नहीं है।
पोइया 13

30

निश्चित रूप से जवाब देने के लिए एक कठिन सवाल। C ++ मानक स्थिति:

कार्यक्रम का पाठ इस अंतर्राष्ट्रीय मानक में स्रोत फ़ाइलों नामक इकाइयों में रखा जाता है। सभी हेडर (17.4.1.2) और स्रोत फ़ाइलों में शामिल (16.2) प्रीप्रोसेसिंग निर्देश #include के माध्यम से एक स्रोत फ़ाइल, किसी भी सशर्त समावेशन (16.1) प्रीप्रोसेसिंग निर्देशों में से किसी भी स्रोत लाइनों को छोड़ दिया जाता है, एक अनुवाद इकाई कहलाता है। [नोट: C ++ प्रोग्राम को सभी को एक ही समय में अनुवादित करने की आवश्यकता नहीं है। ]

इसलिए अधिकांश इरादों और उद्देश्यों के लिए एक अनुवाद इकाई एक एकल सी ++ स्रोत फ़ाइल और हेडर या अन्य फाइलें हैं जिनमें प्रीप्रोसेसर #include तंत्र शामिल है।

आपके अन्य प्रश्नों के बारे में:

2) C ++ के साथ प्रोग्रामिंग करते समय मुझे इसका उपयोग करने पर विचार करना चाहिए

आप इस पर विचार नहीं कर सकते - अनुवाद इकाइयाँ C ++ प्रोग्राम का आधार हैं।

3) यदि यह केवल C ++ से संबंधित है, या इसका उपयोग अन्य प्रोग्रामिंग भाषाओं के साथ किया जा सकता है

अन्य भाषाओं में समान अवधारणाएँ हैं, लेकिन उनके शब्दार्थ सूक्ष्म रूप से भिन्न होंगे। उदाहरण के लिए अधिकांश अन्य भाषाएं प्रीप्रोसेसर का उपयोग नहीं करती हैं।


1
मुझे नहीं पता कि यह स्पष्ट है या नहीं। यह कुछ हद तक दलदली क्षेत्र हो सकता है - यह मानक पैरा से स्पष्ट नहीं है जो मैंने उद्धृत किया है कि पूर्व-संकलित हेडर की अनुमति है, उदाहरण के लिए।

1
@ मन, और यही वह जगह है जहाँ आपको एक परिभाषा नियम के बारे में बहुत सावधान रहना होगा। यदि आप एक वर्ग को अलग-अलग अनुवाद इकाइयों में शामिल करते हैं, तो उस वर्ग को शामिल करने से पहले थोड़ा अलग परिभाषित किया जाता है, जिससे कक्षा का अलग-अलग कोड होता है और यह अपरिभाषित समस्याओं का कारण होगा।
मैट प्राइस

6
@GMan ने मानक: "हेडर" और "सोर्स फाइल" द्वारा उपयोग किए जाने वाले दो शब्दों पर ध्यान दिया। "हैडर" का उपयोग केवल मानक पुस्तकालय के लिए किया जाता है। कुछ कोड द्वारा शामिल की गई उपयोगकर्ता फ़ाइल को मानक द्वारा "हेडर" नहीं कहा जाता है, लेकिन "स्रोत फ़ाइल" है। मानक ".h" और ".cpp" के बीच के अंतर के बारे में नहीं जानते हैं कि हम गरीब c ++ प्रोग्रामर :):
जोहान्स स्काउब -

8

पुस्तक इसे पर्याप्त रूप से स्पष्ट करती है। जब मेयर्स एक "अनुवाद इकाई" का संदर्भ देते हैं, तो उनका मतलब एक स्रोत कोड फ़ाइल होता है।


1
यदि वह स्रोत कोड के बारे में बात कर रहा था, तो वह स्रोत फ़ाइलों को कहेगा। स्रोत कोड को संकलित करके अनुवाद इकाई बनाई जाती है। अलग अंतर नोट करें। यह "अनुवादित" स्रोत कोड है।
दान

3
@ दान: नहीं, यह नहीं है। एक अनुवाद इकाई एक स्रोत फ़ाइल है जिसमें शामिल है जिसे संकलित करने से पहले संकलित किया जा सकता है, अर्थात, प्रीप्रोसेसर का आउटपुट।
एड एस।

1
वास्तव में, C ++ मानक इसे क्या कहते हैं, इसके बावजूद, "अनुवाद इकाई" का उपयोग आमतौर पर अनिवार्य कोड के एकल "यूनिट" के विचार को संप्रेषित करने के लिए किया जाता है। वास्तव में Microsoft कंपाइलर दोस्तों के अनुसार, आप "ट्रांसलेशन यूनिट्स" को सीधे लिंक करते हैं। msdn.microsoft.com/en-us/library/vstudio/…
Dan

1
तो क्या हम "C ++ मानक" नाज़ी बनने की कोशिश कर रहे हैं या क्या हम उद्योग के बाकी लोगों के साथ संवाद करने में मदद करने की कोशिश कर रहे हैं? मुझे पता है कि यह एक C ++ धागा है, इसलिए मैं न जाने क्या-क्या कहती हूं, जो कि एक तुक कहती है। या शब्द की अन्य सभी परिभाषाएँ।
दान

1
@ दान: एक अनुवाद इकाई वह है जिसे मानक कहते हैं। Im वास्तव में यादृच्छिक संकलक देवों की राय से चिंतित नहीं है। दिलचस्प है कि जो आदमी लगभग पांच साल पुरानी पोस्ट को निपिक से खोदता है और मुझे बताता है कि मेरी परिभाषा गलत है और वह मुझे सही करने के लिए "भाषा नाज़ी" कहता है। येश, आगे बढ़ो, तुम निपटने के लिए थक रहे हो।
एड एस।

4

ODR के अलावा, अनुवाद इकाई अनाम नामस्थान की परिभाषा में महत्वपूर्ण है, जो "स्थिर" के पुराने उपयोगों में से एक को प्रतिस्थापित करता है।

मुझे लगता है कि मेरे पास अभी भी शीर्ष उत्तर के तहत टिप्पणी जोड़ने के लिए पर्याप्त बिंदु नहीं हैं।


3

एक अनुवाद इकाई कोड है जिसे संकलक को उचित पास दिया जाता है। यह आमतौर पर .c फ़ाइल पर प्रीप्रोसेसर चलाने से आउटपुट का मतलब है।


2

C और C ++ प्रोग्राम में एक या अधिक स्रोत फ़ाइलें होती हैं, जिनमें से प्रत्येक में प्रोग्राम के कुछ पाठ होते हैं। एक स्रोत फ़ाइल, जिसमें इसकी फ़ाइलें शामिल हैं (ऐसी फाइलें जो #include preprocessor directive का उपयोग करके शामिल की गई हैं) लेकिन सशर्त-संकलन निर्देशों जैसे #if द्वारा हटाए गए कोड के वर्गों को शामिल नहीं करती हैं, इसे "अनुवाद इकाई" कहा जाता है।


1

MSDN के अनुसार : C और C ++ प्रोग्राम में एक या एक से अधिक स्रोत फाइलें होती हैं, जिनमें से प्रत्येक में प्रोग्राम के कुछ टेक्स्ट होते हैं। एक स्रोत फ़ाइल, जिसमें इसकी फ़ाइलें शामिल हैं (ऐसी फाइलें जो #include preprocessor directive का उपयोग करके शामिल हैं) लेकिन सशर्त-संकलन निर्देशों जैसे #if द्वारा हटाए गए कोड के वर्गों को शामिल नहीं करती हैं, इसे "अनुवाद इकाई" कहा जाता है।


0

प्रत्येक cpp / c (कार्यान्वयन) फ़ाइल को अनुवाद इकाई (यानी, ऑब्जेक्ट फ़ाइल (.obj)) में बदल दिया जाएगा। cpp फ़ाइल में हेडर को हेडर फ़ाइलों से वास्तविक पाठ से बदल दिया जाएगा।


0

जैसा कि दूसरों ने कहा है, एक अनुवाद इकाई मूल रूप से प्रीप्रोसेसिंग के बाद स्रोत फ़ाइल की सामग्री है। यह भाषा व्याकरण में सर्वोच्च उत्पादन है; यदि आप C या C ++ कंपाइलर लिख रहे थे तो आपको केवल इसके बारे में चिंता करने की आवश्यकता होगी।


1
"आपको केवल इसके बारे में चिंता करने की आवश्यकता होगी यदि आप C या C ++ कंपाइलर लिख रहे थे।" मैं असहमत हूं: प्रोग्रामर को अक्सर समझने की जरूरत होती है कि कंपाइलर क्या कर रहा है। इसलिए, उदाहरण के लिए, आपको यह जानना होगा कि प्रभावी सी ++ में आइटम # 5 से एक महत्वपूर्ण बिंदु को समझने के लिए एक अनुवाद इकाई क्या है: "विभिन्न अनुवाद इकाइयों में परिभाषित गैर-स्थानीय स्थिर वस्तुओं के प्रारंभिककरण का सापेक्ष क्रम अपरिभाषित है"।
मूर

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.