2009-04-10 17 views
42

में कनवर्ट करने के लिए मेरे पास कुछ सी ++ कोड है। कोड में कई कक्षाएं परिभाषित की गई हैं, उनके सदस्य कार्य, रचनाकार, उन वर्गों के लिए विनाशक, कुछ टेम्पलेट वर्ग और सी ++ सामानों के बहुत सारे हैं। अब मुझे स्रोत को सादे सी कोड में बदलने की जरूरत है।सी ++ कोड से सी

मैं निम्नलिखित प्रश्न:

  1. वहाँ सी कोड के लिए सी ++ कोड और हेडर फाइल कन्वर्ट करने के लिए किसी भी उपकरण है?

  2. मैं कोड की कुल पुनर्लेखन करना होगा (मैं कंस्ट्रक्टर्स, विनाशकर्ता को हटाने और कुछ init(), deinit() कार्यों में है कि कोड को स्थानांतरित करना होगा;, संरचनाओं के परिवर्तन कक्षाएं उन में समारोह संकेत के रूप में मौजूदा सदस्य कार्यों बनाने नई परिभाषित संरचनाएं और फिर फ़ंक्शन पॉइंटर्स आदि का उपयोग करके उन कार्यों को आमंत्रित करें ..)?

  3. अगर मुझे इसे मैन्युअल रूप से परिवर्तित करना है, तो C++ विशिष्ट कोड-डेटा संरचना/अर्थशास्त्र क्या मुझे सी ++ से सी में रूपांतरण करते समय ध्यान देना होगा?

उत्तर

29

वास्तव में ऐसा टूल है, तो कॉमौ का सी ++ कंपाइलर। । यह सी कोड उत्पन्न करेगा जिसे आप मैन्युअल रूप से बनाए नहीं रख सकते हैं, लेकिन यह कोई समस्या नहीं है। आप सी ++ कोड बनाए रखेंगे, और बस फ्लाई पर सी में कनवर्ट करेंगे।

+0

@MSalters: Comaus संकलक के बारे में सूचक के लिए धन्यवाद। लेकिन दुख की बात यह है कि मेरे उद्देश्य की सेवा नहीं करता है, क्योंकि आउंस कंपाइलर इंटरमीडिएट प्रारूप सी कोड प्राप्त करना संभव नहीं है, और यहां तक ​​कि अगर हम किसी भी तरह से सामान्य एएनएसआई-सी कंपाइलर्स द्वारा संकलित नहीं करते हैं। – goldenmean

+2

यदि आपका कोड अपवाद और टेम्पलेट का उपयोग नहीं करता है तो आपको अपने कोड पर काम करने के लिए सीफ़्रंट की पुरानी प्रति प्राप्त करने का मौका मिल सकता है। लेकिन जैसा कि एमएसल्टर्स ने कहा कि यह बदसूरत होने जा रहा है :-) – lothar

+0

इसे किसी भी मानक लाइब्रेरी कार्यक्षमता का उपयोग करना होगा –

6

जबकि आप सी में ओओ कर सकते हैं (उदाहरण के लिए theType *this विधियों के लिए पहला पैरामीटर जोड़कर, और मैन्युअल रूप से बहुरूपता के लिए vtables जैसे कुछ को संभालने के द्वारा) यह कभी भी डिज़ाइन के रूप में विशेष रूप से संतोषजनक नहीं होता है, और बदसूरत लगेगा (यहां तक ​​कि कुछ पूर्व- प्रोसेसर हैक्स)।

मैं कम से कम एक पुन: डिज़ाइन को देखने का सुझाव दूंगा कि यह कैसे काम करेगा।

कुल मिलाकर बहुत महत्वपूर्ण प्रश्न के उत्तर पर निर्भर करता है: यदि आपके पास सी ++ कोड काम कर रहा है, तो आप इसके बजाय सी क्यों चाहते हैं?

+5

लेखक के कारण स्पष्ट रूप से विशिष्ट रूप से विशिष्ट हैं, लेकिन कारण मौजूद हैं। कभी-कभी एक सी ++ कंपाइलर किसी विशेष प्लेटफ़ॉर्म पर मौजूद नहीं होता है, या हो सकता है कि किसी कारण से उपलब्ध न हो। यह एक बहुत ही उत्कृष्ट शिक्षण उपकरण के रूप में भी कार्य करता है। – TechZilla

17

http://llvm.org/docs/FAQ.html#translatecxx

पुनश्च: मैं बिल्कुल भी उपयोग नहीं किया है। अगर यह काम करता है तो मुझे बताएं।

+0

@ plan9assembler: सूचक के लिए धन्यवाद। मैं इसे देख लूंगा और आपको बता दूंगा। – goldenmean

+1

मैंने एलएलवीएम का उपयोग कर hello_world.cpp से सी फ़ाइल को बदलने की कोशिश की है। परिणामी सी कोड मशीन कोड के रूप में बदसूरत है। प्रीप्रोसेसर के सभी शामिल हैं। – MikimotoH

+1

@ मिकिमोटोएच, ऐसा लगता है क्योंकि यह सिंटैक्स स्रोत अनुवाद के लिए वाक्यविन्यास नहीं है। यह वास्तव में एक संकलक है जो सी को आउटपुट कर सकता है, जिसका अर्थ है कि आप अभी भी किसी भी लिंक किए गए C++ libs पर निर्भर हैं। यह वास्तव में डीबगिंग, या देखने के लिए सामग्री के रूप में सबसे अच्छा इस्तेमाल किया जाता है। बीटीडब्लू: बदसूरत यह हो सकता है, लेकिन मुझे मशीन कोड से बेहतर मानना ​​है और आप कम से कम इसे सीख सकते हैं। आप किसी भी disassembly की तुलना में clang C++ से सी से बेहतर सीख सकते हैं। – TechZilla

5

शायद अच्छा ओल 'cfront करेगा?

+3

जहां तक ​​मुझे पता है, सीफ़्रंट लंबे समय तक बनाए रखा नहीं गया है और आधुनिक सी ++ कोड को संभालने की संभावना नहीं है। –

4

एक कंपाइलर में दो प्रमुख ब्लॉक होते हैं: 'फ्रंट एंड' और 'बैक एंड'। एक कंपाइलर का फ्रंट एंड स्रोत कोड का विश्लेषण करता है और कहा गया स्रोत कोड के 'मध्यस्थ प्रतिनिधित्व' का कुछ रूप बनाता है जो स्रोत कोड की तुलना में मशीन एल्गोरिदम द्वारा विश्लेषण करना बहुत आसान होता है (यानी स्रोत कोड जैसे सी ++ डिज़ाइन किया गया है कोड लिखने के लिए मानव प्रोग्रामर की सहायता के लिए, मध्यस्थ रूप को एल्गोरिदम को सरल बनाने में मदद के लिए डिज़ाइन किया गया है जो मध्यवर्ती रूपों का विश्लेषण आसान बनाता है)। एक कंपाइलर का पिछला अंत मध्यस्थ रूप लेता है और फिर इसे 'लक्षित भाषा' में परिवर्तित करता है।

अब, सामान्य उपयोग कंप्यूटर्स के लिए लक्षित भाषा विभिन्न प्रोसेसर के लिए असेंबलर भाषाएं हैं, लेकिन कुछ अन्य भाषा में कोड बनाने के लिए एक कंपाइलर बैक एंड को प्रतिबंधित करने के लिए कुछ भी नहीं है, जब तक कि लक्षित भाषा (कम से कम) एक सामान्य सीपीयू असेंबलर के रूप में लचीला के रूप में।

अब, जैसा कि आप शायद कल्पना कर सकते हैं, सी निश्चित रूप से एक सीपीयू के असेंबलर के रूप में लचीला है, जैसे सी ++ से सी कंपाइलर वास्तव में तकनीकी पीओवी से लागू करने में कोई समस्या नहीं है।

तो तुम है: सी ++ --- दृश्यपटल ---> someIntermediaryForm --- बैकएंड ---> सी

आप इन लोगों की जाँच कर सकते हैं: http://www.edg.com/index.php?location=c_frontend (ऊपर लिंक बस के लिए जानकारीपूर्ण है क्या किया जा सकता है, वे लाइसेंस उनके सामने जहाँ तक मुझे पता है हजारों डॉलर की) दसियों

पुनश्च के लिए समाप्त हो जाती है, कोई इस तरह के एक सी ++ सी संकलक के लिए जीएनयू से वहाँ है, और यह पूरी तरह से मुझे धड़कता है (यदि मैं इसके बारे में सही हूँ)। चूंकि सी भाषा काफी छोटी है और इसकी आंतरिक तंत्र काफी प्राथमिक हैं, एक सी कंपाइलर को एक व्यक्ति-वर्ष के काम की तरह कुछ चाहिए (मैं आपको यह पहला हाथ बता सकता हूं क्योंकि मैंने साल पहले ऐसा संकलक लिखा था, और यह एक [ वर्चुअल] स्टैक मशीन इंटरमीडिएरी कोड), और एक सी, कंपाइलर को लिखने में सक्षम होने के दौरान एक बार सी संकलक लिखने में सक्षम होने के बाद एक बड़ी बात होगी ...

+0

सामान्य उपयोग कंप्यूटर्स के लिए लक्षित भाषा विभिन्न प्रोसेसर के लिए असेंबलर भाषाएं (या मशीन कोड ??) हैं – qPCR4vir

2

यह पुराना है धागा लेकिन स्पष्ट रूप से C++ Faq पर section है। अगर लेखक से संपर्क किया जाता है तो यह स्पष्ट रूप से अपडेट हो जाएगा, इसलिए यह शायद लंबे समय तक अधिक अद्यतित होगा।