2012-01-14 16 views
12

यह एक बहुत ही सामान्य सवाल है। मैं स्वयं को सिखाया गया 'प्रोग्रामर' जो सी # में प्रोग्राम करता है। यदि मैं सी ++ जानता था तो एक परियोजना जिस पर मैं काम करना चाहता हूं, उसे बहुत आसान (चीजों की भव्य योजना में) बनाया जाएगा। सी # से सी ++ में स्थानांतरित करना कितना आसान है? मुझे किसी भी नुकसान के लिए देखना चाहिए? और यदि मैं वीएस -2010 का उपयोग कर रहा हूं, तो क्या मैं प्रोग्राम (उसी कक्षा में नहीं, बल्कि एक ही प्रोजेक्ट में) सी # और सी ++ दोनों में कुछ कर सकता हूं?सी # से सी ++ (साथ ही साथ एक ही समाधान में दोनों के साथ काम करना)

+14

यह आसान है (http://m5p.com/~pravn/foot.html) [अपने आप को सी में पैर ++ में गोली मार] और यह आप सी # में की तुलना में अधिक चोट लगी होगी। –

+7

@UweKeim यह उल्लसित है, मैं वास्तव में एक अच्छा हंसी था! धन्यवाद! – formatc

+2

@keynesiancross मैं माफी चाहता हूँ कहने के लिए आप कुछ ** वास्तव में ** कठिन दिन आने वाले ahahahahaah – Chani

उत्तर

21

सी # से सी ++ में स्थानांतरित करना आसान नहीं है। मूल वाक्यविन्यास वही दिखाई दे सकता है (उदा। यदि, ... के लिए), लेकिन गहरे अंतर हैं, उदा। आरएआईआई पैटर्न और स्टैक-सेमेंटिक्स वेरिएबल्स जिनके विनाशकों को स्कोप से बाहर जाने पर बुलाया जाता है, आदि सी # में मौजूद नहीं हैं।

इसके अलावा, सी # एक गैर-निर्धारक कचरा कलेक्टर का उपयोग करता है (जो स्मृति संसाधनों के लिए ठीक हो सकता है, लेकिन अन्य प्रकार के संसाधनों के लिए बेकार है)। इसके बजाय, आधुनिक सी ++ के साथ, आप टेम्पलेट्स और स्मार्ट पॉइंटर्स (जैसे std ::/boost :: * shared_ptr *) का उपयोग कर सकते हैं, जो आपको निर्धारक संदर्भ-गणना "कचरा संग्रह", जो बहुत ही कुशल है, और है स्मृति और गैर-स्मृति संसाधन दोनों के लिए मान्य (जैसे फ़ाइल हैंडल, सॉकेट, बनावट ...)।

इसके अलावा, सी # जेनरिक सी ++ टेम्पलेट्स से बहुत अलग हैं (सी ++ टेम्पलेट्स बहुत शक्तिशाली हैं, और प्रोग्रामिंग की एक उन्नत स्तर मेटा प्रोग्रामिंग टेम्पलेट बुलाया अनुमति देते हैं)।

वीएस -2010 में आप सी ++ और सी # परियोजनाओं दोनों को होस्ट करने का समाधान कर सकते हैं। दो दुनिया (सी ++ की मूल दुनिया और .NET/C# की प्रबंधित दुनिया) के बीच संवाद करने के लिए आप सी ++/सीएलआई का उपयोग ब्रिजिंग परत के रूप में कर सकते हैं।

विंडोज 8 में एक नई तकनीक पेश की जानी चाहिए, जिसे विनआरटी (COM पर आधारित) कहा जाता है, जो अंतर-भाषा संचार की अनुमति देता है। इस मामले में, आप C++ का उपयोग WRL (टेम्पलेट-आधारित लाइब्रेरी) या C++/CX भाषा एक्सटेंशन के साथ C++ घटकों को बनाने के लिए कर सकते हैं जिनका उपयोग C# और .NET से किया जा सकता है।

हैप्पी लर्निंग।

+1

अपने ठोस प्रतिक्रिया के लिए धन्यवाद किया है। अब, बेशक, मुझे नहीं पता कि क्या पहले तीन चीजें आप के बारे में बात कर रहे हैं ... (आरए II/ढेर sematics ??, गैर नियतात्मक कचरा कलेक्टर ?? और टेम्पलेट्स ??) – keynesiancross

+1

है, तो आप का उल्लेख 'shared_ptr' आप पर होना चाहिए कम से कम एक जीसी (चक्र, मल्टीथ्रेडिंग, प्रदर्शन) की तुलना में इसके साथ स्पष्ट समस्याओं का भी उल्लेख करें, अन्यथा इससे अनजान के लिए दिलचस्प आश्चर्य हो सकता है। मामूली नोट: कुशल गिनती गिनती? नहीं वास्तव में नहीं। – Voo

+0

@Voo: रेफ गिनती एक कचरा कलेक्टर पृष्ठभूमि थ्रेड के रूप में चलने से निश्चित रूप से अधिक कुशल है और कुछ समय पर स्मृति चिन्हण करने और इसे साफ़ करने के लिए सब कुछ ठंडा कर देता है। इसके अलावा, मुझे लगता है कि .NET जीसी मेमोरी प्रेशर के तहत चलाया जाता है, लेकिन इसमें अन्य संसाधनों (जैसे सॉकेट, या ग्राफिक्स कार्ड पर बनावट मेमोरी इत्यादि) के बारे में कोई जानकारी नहीं है। इसके बजाय सी ++ विनाशकों और साझा_पीआरआर के साथ हर संसाधन (न केवल सिस्टम मेमोरी) जारी किए जाते हैं जैसे कोई भी उन्हें संदर्भित नहीं करता है। –

5

क्या मैं प्रोग्राम कर सकता हूं (एक ही कक्षा में नहीं, लेकिन एक ही परियोजना में) सी # और सी ++ दोनों में कुछ?

उत्तर नहीं है कि आप नहीं कर सकते हैं। यदि आप प्रबंधित C++ & C++ का उपयोग कर सकते हैं तो आप कर सकते हैं। लेकिन अगर आप के साथ सी # काम कर रहे हैं तो आप एक ही परियोजना के अंदर सी # और सी ++ कोड नहीं हो सकता

यह सी # से सी ++ के लिए स्थानांतरित करने के लिए कितना आसान है? `

यह एक सा व्यक्तिपरक है लेकिन मेरी राय में यह एक बहुत कठिन कदम होगा। सी ++ एक अलग भाषा है इसलिए यह एक नई भाषा सीखने जितना कठिन होगा :) फिर यह व्यक्तिपरक है इसलिए मैं विवरण में नहीं जाऊंगा

5

चूंकि आप .NET के साथ काम कर रहे हैं, मुझे लगता है कि आप विजुअल स्टूडियो का उपयोग कर रहे हैं?

/clr कंपाइलर विकल्प का उपयोग करके, उसी प्रोग्राम में सी # और सी ++ को जोड़ना आसान है। आपके सी ++ कोड में सामान्य, मानक-अनुपालन सी ++ कक्षाएं, और ref class .NET ऑब्जेक्ट्स को C# से उपयोग के लिए डिज़ाइन किया गया हो सकता है। दोनों अलग हैं लेकिन ref class से देशी class पर पॉइंटर्स के माध्यम से, और gcroot देशी class से ref class पर पॉइंटर्स के माध्यम से एक दूसरे तक पहुंच सकते हैं।

ध्यान दें कि मैंने कहा कि "एक ही कार्यक्रम में", नहीं "में एक ही परियोजना"। आपको दो भागों, एक सी # प्रोजेक्ट और एक सी ++/सीएलआई प्रोजेक्ट में विभाजित करना होगा, और एक डीएलएल होगा जो अन्य भार। निर्माण के दौरान दोनों को एक साथ जोड़ने के लिए एक चाल भी है ताकि आप एक निष्पादन योग्य फ़ाइल के साथ समाप्त हो जाएं, लेकिन यह आमतौर पर इसके लायक होने की तुलना में अधिक परेशानी है।


ध्यान दें, तो आप इस स्मार्ट सूचक वर्ग मैं उपयोगी लिखा मिल सकती है, यह बहुत आसान ref class नेट वस्तुओं से देशी class वस्तुओं का उपयोग करता है।

9

मैं C++ C# करने से अन्य तरह से आया था। कई तरीकों से राहत मिली थी। सी ++ में विशेष रूप से स्मृति आवंटन के आसपास सी # से बहुत अधिक नियम हैं। वाक्यविन्यास भी चुनौतीपूर्ण हो सकता है और सीमाओं की स्मृति से बाहर निकलना आसान है। सी ++ लेकिन बहुत अधिक उपयुक्त प्रणाली स्तर की प्रोग्रामिंग के लिए लेकिन महान शक्ति के साथ बड़ी जिम्मेदारी आता है।

मैं पहली बार स्कॉट मेयर की Effective C++ की एक प्रति हथियाने और उसे कवर करने के कवर को पढ़ने की सलाह देते हैं। यह मूलभूत संसाधन प्राप्त करने के लिए मुझे सबसे अच्छा संसाधन है और बिना किसी सवाल के मैंने "अनुभवी" सी ++ डेवलपर के रूप में उत्पादित कोड की गुणवत्ता में सुधार किया है। फिर एक इकाई परीक्षण रूपरेखा आकर्षित करने तथा c++ kata पर एक नज़र डालें (एक xcode परियोजना इस मामले में, लेकिन अभी भी उपयोगी होना चाहिए)। और Standard Template Library से परिचित हो जाएं जिसमें कंटेनर, एल्गोरिदम इत्यादि के लिए बहुत उपयोगी/कुशल कोड/कक्षाएं हैं

आखिरकार, शुभकामनाएं। एक नई भाषा सीखना हमेशा एक चुनौती है और यह चुनौतीपूर्ण हो सकता है लेकिन भुगतान आमतौर पर इसके लायक है। यदि कुछ और नहीं है तो आप अपनी सी # कोड को नई आंखों से देखेंगे।

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