2011-12-01 15 views
10

में अनुवाद इकाई सी ++ और सी में अनुवाद इकाई क्या है इसके बीच कोई अंतर है?सी और सी ++

अन्य पोस्टों में, मैंने पढ़ा है कि एक हेडर और स्रोत फ़ाइल एक अनुवाद इकाई बनाती है, लेकिन क्या एक स्रोत फ़ाइल को अकेले सी ++ में अनुवाद इकाई कहा जा सकता है जहां इसमें एक फ़ाइल में सभी परिभाषाएं होती हैं?

+4

प्रीप्रोसेस्ड स्रोत फाइलें अनुवाद इकाइयां हैं। –

+1

@KerrekSB क्या यह कोई जवाब नहीं है? – daramarak

+0

@KerrekSB, प्रतिनिधि टोपी? :) –

उत्तर

22

एक अनुवाद इकाई "एक शीर्षलेख और स्रोत फ़ाइल" नहीं है। इसमें एक हजार शीर्षलेख फ़ाइलें शामिल हो सकती हैं (और एक हजार स्रोत फ़ाइलें भी)।

एक अनुवाद इकाई जिसे आमतौर पर प्रीप्रोसेस्ड होने के बाद "स्रोत स्रोत" या ".cpp फ़ाइल" के रूप में जाना जाता है। अगर स्रोत फ़ाइल #include अन्य फाइलें उन फ़ाइलों का टेक्स्ट प्रीप्रोसेसर द्वारा अनुवाद इकाई में शामिल हो जाती है। इस मामले पर सी और सी ++ के बीच कोई अंतर नहीं है।

+0

यदि मैंने वर्ग घोषणा को रखने के लिए '.h' का उपयोग करने के बजाय' .cpp' में अपनी कक्षा परिभाषा डाली है। क्या मैं उस '.cpp' को एक अनुवाद इकाई कह सकता हूं? – user103214

+1

हां, हेडर फ़ाइलों को रखने की कोई आवश्यकता नहीं है। –

+3

@ user974191: आपको अपने कोड को कॉपी करने से बचने के लिए हेडर का उपयोग करना चाहिए। '# शामिल' तंत्र आपको एक बार लिखने की अनुमति देता है और संकलक इसे आपके लिए कॉपी करता है: हालांकि यह कोड संगठन का मामला है, और अनुवाद इकाई की अवधारणा के साथ बहुत कुछ नहीं करना है। –

1

हेडर को प्रीप्रोकैसिंग पर .cpp फ़ाइल में जोड़ा गया है, इसलिए कंपिलेटर मूल रूप से कोड के बड़े हिस्से पर काम कर रहा है, जिसमें .cpp और सभी शामिल हैं। "# शामिल" द्वारा जोड़ा गया।

यह अनुवाद इकाई है।

0

एक अनुवाद इकाई वास्तव में आपको एक बार स्रोत और हेडर फाइलों को प्रीप्रोकैसिंग (जो हेडर फाइलों का उपयोग करके स्रोत का विस्तार करती है) और प्रीकंपिलेशन के माध्यम से पारित हो जाती है। कंपाइलर आपके कंपाइलर आउटपुट निर्देशिका में देखे गए .obj फ़ाइलों का उत्पादन करने के लिए अनुवाद इकाई का उपयोग करता है।

+0

- प्रीकंपिलेशन (जहां तक ​​मुझे पता है वहां कोई ऐसा कदम नहीं है) –

+1

प्रीकंपिल्ड हेडर का उत्पादन - बड़ी सी ++ परियोजनाओं पर काफी आम है। – ChrisBD

+0

आह! मैं वास्तव में इसे precompilation डब नहीं होगा, लेकिन अब मैं समझता हूँ। आम होने के नाते ... हाँ और नहीं। मैं उन परियोजनाओं पर काम कर रहा हूं जो लाखों लाइनों को साझा करते हैं और हिरन के लिए सबसे अच्छा बैंग हेडर को प्रीकंपल नहीं करना था, बल्कि उत्पादित वस्तुओं को एक ही टीम (सीसीएसी) के डेवलपर्स के बीच साझा करना और निर्माण वितरित करना था। –

1

यह “ अंतर ” द्वारा आपके मतलब पर निर्भर करता है। सी और सी ++ दोनों इसे समान रूप से परिभाषित करते हैं: मूल रूप से, जब आप एक स्रोत फ़ाइल संकलित करते हैं तो संकलित हो जाता है (इस प्रकार, सभी शामिल हेडर, विस्तारित मैक्रोज़ इत्यादि)। लेकिन यह दो भाषाओं में एक ही बात नहीं है; बातें टेम्पलेट्स की तरह है कि अनुवाद इकाइयों सी में अलग ढंग से व्यवहार करते हैं ++ से सी में मतलब (सी ++, एक परिभाषा नियम है, उदाहरण के लिए।)

+0

क्या एक परिभाषा नियम द्वारा दो .cpp फ़ाइलों में एक ही नाम के साथ दो वर्ग परिभाषाएं ठीक है? धन्यवाद। – user103214

+0

@ user974191 केवल तभी जब वे बिल्कुल एक ही टोकन होते हैं, और सभी प्रतीकों को एक ही चीज़ से बांधना पड़ता है। यही कारण है कि नामित नामस्थान पेश किए गए थे: स्थानीय वर्गों को एक अनाम नामस्थान में रखें, और उनका पूर्ण योग्य नाम अलग है; वे अब एक ही कक्षा नहीं हैं, क्योंकि उनके पास अब वही नाम नहीं है। –

-2

स्रोत संकलक द्वारा देखा फ़ाइलों का सेट और एक इकाई के रूप में अनुवाद किया

+0

यदि आप अपने उत्तर को पूर्ण वाक्यों में समझा सकते हैं तो यह अधिक उपयोगी होगा। – ilke444