मेरा मानना ​​है कि जब मेरे पास नहीं होना चाहिए, तो मैंने सी और सी ++ कोड मिलाया है; क्या यह एक समस्या है और कैसे सुधारा जाए?


10

पृष्ठभूमि / परिदृश्य

मैंने सी में एक सीएलआई एप्लिकेशन को शुद्ध रूप से लिखना शुरू कर दिया (मेरा पहला उचित सी या सी ++ प्रोग्राम जो "हैलो वर्ल्ड" या उसके रूपांतर नहीं था)। उपयोगकर्ता इनपुट (char arrays) के "तार" के साथ काम कर रहा था और मैंने C ++ स्ट्रिंग स्ट्रीमर ऑब्जेक्ट की खोज की थी। मैंने देखा कि मैं इनका उपयोग करके कोड को बचा सकता हूं, इसलिए मैंने उन्हें एप्लिकेशन के माध्यम से उपयोग किया। इसका मतलब है कि मैंने फ़ाइल एक्सटेंशन को .cpp में बदल दिया है और अब g++इसके बजाय एप्लिकेशन को संकलित करता हूं gcc। तो इसके आधार पर, मैं कहूंगा कि आवेदन अब तकनीकी रूप से एक C ++ एप्लिकेशन है (हालाँकि 90% + कोड में लिखा है कि मैं C को क्या कहूंगा, क्योंकि दो भाषाओं के बीच बहुत से क्रॉस-ओवर हैं, मेरे सीमित अनुभव को देखते हुए दो)। यह एक एकल .cpp फ़ाइल है जो लगभग 900 रेखाएँ लंबी है।

महत्वपूर्ण कारक

मैं चाहता हूं कि कार्यक्रम मुफ्त (धन के रूप में) हो और सभी के लिए स्वतंत्र रूप से वितरण योग्य और उपयोगी हो। मेरी चिंता यह है कि कोई व्यक्ति कोड को देखेगा और उसके प्रभाव के बारे में कुछ सोचेगा:

ओह कोडिंग को देखो, यह भयानक है, यह कार्यक्रम मेरी मदद नहीं कर सकता है

जब यह संभव है! एक अन्य मामला कोड कुशल है (यह ईथरनेट कनेक्टिविटी के परीक्षण के लिए एक कार्यक्रम है)। कोड का कोई भी भाग ऐसा नहीं होना चाहिए जो इतना अक्षम हो कि वे अनुप्रयोग या इसके आउटपुट के प्रदर्शन में गंभीर बाधा उत्पन्न कर सके। हालांकि, मुझे लगता है कि विशिष्ट कार्यों, विधियों, ऑब्जेक्ट कॉल, आदि के साथ मदद मांगने पर स्टैक ओवरफ्लो का सवाल है।

मेरा प्रश्न

मेरी राय में) C और C ++ को मिलाया जहाँ शायद मुझे नहीं करना चाहिए था। क्या मुझे इसे C ++ में फिर से लिखना चाहिए (इसका मतलब है कि मैं और अधिक C ++ ऑब्जेक्ट्स और विधियों को लागू करता हूं जहां शायद मैंने C शैली में कुछ कोडित किया है जिसे नए C ++ तकनीकों का उपयोग करके संघनित किया जा सकता है), या स्ट्रिंग स्ट्रीप ऑब्जेक्ट्स का उपयोग हटा दें यह सब "वापस" सी कोड के लिए ले आओ? क्या यहां सही दृष्टिकोण है? मैं खो गया हूं और इस आवेदन को जनता की नजर में "अच्छा" रखने के लिए कुछ मार्गदर्शन की आवश्यकता है, इसलिए वे इसका उपयोग करेंगे और इसके लिए लाभान्वित होंगे।

कोड - अद्यतन

यहाँ कोड के लिए एक लिंक है। यह लगभग 40% टिप्पणियां हैं, मैं लगभग हर पंक्ति पर टिप्पणी करता हूं जब तक कि मैं अधिक धाराप्रवाह महसूस नहीं करता। हालांकि मैंने जो कॉपी की है, उसमें मैंने सभी टिप्पणियों को हटा दिया है। मुझे आशा है कि यह पढ़ने में बहुत कठिन नहीं है। मैं उम्मीद कर रहा हूं कि हालांकि किसी को भी इसे पूरी तरह समझने की जरूरत नहीं है। यदि मैंने हालांकि घातक डिजाइन दोष बनाए हैं, तो मुझे उम्मीद है कि उन्हें आसानी से पहचाना जा सकता है। मुझे यह भी उल्लेख करना चाहिए, मैं उबंटू डेस्कटॉप और लैपटॉप की एक जोड़ी लिख रहा हूं। मैं अन्य ऑपरेटिंग सिस्टम के लिए कोड पोर्ट करने का इरादा नहीं कर रहा हूं।


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

आप इसे FORTRAN में दोबारा लिख ​​सकते हैं। मैंने OOF के बारे में कभी नहीं सुना।
ott--

2
अगर यह "सुंदर" नहीं है तो मैं आपके सॉफ़्टवेयर का उपयोग न करने वाले लोगों के बारे में बहुत अधिक चिंता नहीं करूंगा। आपके 99% उपयोगकर्ता कोड या देखभाल के बारे में भी नहीं देखेंगे कि यह कैसे लिखा जाता है जब तक यह पूरा हो जाता है कि उन्हें क्या करने की आवश्यकता है। हालांकि, यह महत्वपूर्ण है कि इसे लंबे समय तक बनाए रखने में आपकी मदद करने के लिए कोड सुसंगत हो, आदि ।
इविक्टोस

1
क्यों आप अपनी बात नहीं बनाते हैं मुफ्त सॉफ्टवेयर (जैसे तहत GPLv3 जैसे पर कोड के साथ लाइसेंस), GitHub । आपके कोड में LICENSEफ़ाइल की कमी है । आपको दिलचस्प प्रतिक्रिया मिल सकती है।
बेसिल स्टारीनेवविच

जवाबों:


13

आइए शुरुआत में शुरू करें: मिश्रित सी और सी ++ कोड काफी सामान्य है। तो आप शुरू करने के लिए एक बड़े क्लब में हैं। हमारे पास जंगली में विशाल सी कोडबेस हैं। लेकिन स्पष्ट कारणों से कई प्रोग्रामर सी में कम से कम नया सामान लिखने से इनकार करते हैं, एक ही कंपाइलर में सी ++ तक पहुंच होने से नए मॉड्यूल उस तरह से लिखे जाने लगते हैं - सबसे पहले सिर्फ मौजूदा हिस्सों को छोड़कर।

फिर अंततः कुछ मौजूदा फाइलें C ++ के रूप में फिर से मिल जाती हैं, और कुछ पुलों को हटाया जा सकता है ... लेकिन इसमें वास्तव में लंबा समय लग सकता है।

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

कोडबेस को फिर से काम करना एक अच्छा विचार है, अगर यह टूट गया है। या अगर यह विकास के रास्ते में है। लेकिन अगर यह काम करता है (शब्द के मूल अर्थ में), तो कृपया सबसे बुनियादी इंजीनियरिंग सिद्धांत का पालन करें: यदि यह टूट नहीं गया है, तो इसे ठीक न करें। अकेले ठंडे भागों को छोड़ दें, अपना प्रयास करें जहां यह मायने रखता है। उन हिस्सों पर जो खराब हैं, खतरनाक हैं - या नई सुविधाओं में, और उन्हें बिस्तर बनाने के लिए बस रिफ्लेक्टर भागों।

यदि आप सामान्य चीजों को संबोधित करना चाहते हैं, तो यहां सी कोडबेस से निकालने लायक क्या है:

  • सभी स्ट्रिंग * फ़ंक्शंस और चार [] - उन्हें एक स्ट्रिंग क्लास के साथ बदलें
  • यदि आप स्प्रिंटफ का उपयोग करते हैं, तो एक संस्करण बनाएं जो परिणाम के साथ एक स्ट्रिंग लौटाता है, या इसे स्ट्रिंग में डालता है, और उपयोग को प्रतिस्थापित करता है। (यदि आप कभी भी स्ट्रीम से परेशान नहीं होते हैं तो अपने आप पर एक एहसान करें और उन्हें तब तक छोड़ दें, जब तक आप उन्हें पसंद न करें; प्रारूप की जाँच के लिए gcc सही प्रकार की सुरक्षा प्रदान करता है, बस उचित विशेषता जोड़ें।
  • अधिकांश मॉलोक और मुफ्त - नए और हटाने के साथ नहीं, बल्कि वेक्टर, सूची, मानचित्र और अन्य संग्रह।
  • स्मृति प्रबंधन के बाकी (पिछले दो बिंदुओं के बाद यह बहुत दुर्लभ होना चाहिए, स्मार्ट पॉइंटर्स के साथ कवर करें या अपने विशेष संग्रह को लागू करें
  • RAII रैपर या कक्षाओं का उपयोग करने के लिए अन्य सभी संसाधन उपयोग (FILE *, mutex, lock, आदि) को बदलें

जब आप इसके साथ हो जाते हैं, तो आप उस बिंदु पर पहुंच जाते हैं, जहां कोडबेस यथोचित अपवाद-सुरक्षित हो सकता है, इसलिए आप केवल उच्च-स्तरीय कार्यों में अपवादों और दुर्लभ कोशिश / कैच का उपयोग करके रिटर्न-कोड फुटबॉल को छोड़ सकते हैं ।

इससे परे कि बस कुछ स्वस्थ सी ++ में नया कोड लिखें, और यदि कुछ कक्षाएं पैदा होती हैं जो मौजूदा कोड में अच्छे प्रतिस्थापन हैं, तो उन्हें उठाएं।

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

मेरा सुझाव है कि सटर / अलेक्जेंड्रेस्कु के सी ++ कोडिंग मानकों को पढ़ना अगर अभी तक नहीं किया गया है और उन्हें बारीकी से पालन करना है।


इनपुट बालोग के लिए बहुत बहुत धन्यवाद, मेरी आँखों में सभी ध्वनि सलाह और मैं सभी से सहमत हूं। मुझे लगता है कि धीरे-धीरे काम करने वाले कोड को प्राथमिकता देते हुए, मुझे लगता है कि अनुभाग द्वारा कोड अनुभाग को बदल दिया जाएगा।
jwbensley

7

संक्षेप में: आप नरक में नहीं जा रहे हैं, कुछ भी बुरा नहीं होगा, लेकिन आप किसी भी सौंदर्य प्रतियोगिताओं को जीतने नहीं जा रहे हैं।

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

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


सलाह के लिए धन्यवाद tdammers। आप जो कह रहे हैं उससे मैं सहमत हूं और मैं इसे बोर्ड पर ले जा रहा हूं, धन्यवाद!
jwbensley

4

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

इसलिए क्योंकि C ++ इतना जटिल है, आप अक्सर देखते हैं कि लोग अपने कोड में कुछ सीमित उपसमुच्चय का उपयोग करते हैं। शुरुआती अक्सर धारा I / O, स्ट्रिंग ऑब्जेक्ट्स का उपयोग करते हैं, और मॉलॉक / मुक्त के बजाय नए / हटाते हैं, और शायद पॉइंटर्स के बजाय संदर्भ। जैसा कि आप ऑब्जेक्ट-ओरिएंटेड सुविधाओं के बारे में जानते हैं, आप "सी विद क्लासेस" नामक शैली में लिखना शुरू कर सकते हैं। आखिरकार, जैसे ही आप C ++ के बारे में अधिक सीखते हैं, आप टेम्पलेट, RAII , STL , स्मार्ट पॉइंटर्स आदि का उपयोग करना शुरू कर देते हैं ।

मैं जिस बिंदु को बनाने की कोशिश कर रहा हूं वह यह है कि C ++ सीखना एक प्रक्रिया है जिसमें समय लगता है। हां, अभी आपका कोड संभवतः ऐसा लगता है जैसे कि यह एक सी प्रोग्रामर द्वारा C ++ लिखने की कोशिश कर रहा था। और जब से आप सीख रहे हैं, यह पूरी तरह से ठीक है। हालांकि, यह मुझे परेशान करता है, जब मैं अनुभवी प्रोग्रामरों द्वारा लिखे गए प्रोडक्शन कोड में इस तरह की चीज देखता हूं जिसे बेहतर जानना चाहिए।

बस याद रखें, एक अच्छा फोरट्रान प्रोग्रामर किसी भी भाषा में अच्छा फोरट्रान कोड लिख सकता है। :)


2

ऐसा लगता है कि आप ठीक उसी तरह से पुनरावृत्ति कर रहे हैं जिस तरह से C ++ में जाने पर पुराने C प्रोग्रामर ने बहुत कुछ लिया। आप इसे "बेहतर सी" के रूप में उपयोग कर रहे हैं। बीस साल पहले यह कुछ समझ में आया था, लेकिन इस बिंदु पर C ++ (मानक टेम्पलेट लाइब्रेरी की तरह) में इतने अधिक शक्तिशाली निर्माण हैं कि यह अब शायद ही समझ में आता है। कम से कम, आपको अपने कोड को देखते समय C ++ प्रोग्रामर एन्यूरिज्म देने से बचने के लिए निम्नलिखित करने की संभावना होनी चाहिए:

  • के बजाय धाराओं का उपयोग करें? printfपरिवार।
  • के newबजाय का उपयोग करें malloc
  • सभी डेटा संरचनाओं के लिए STL कंटेनर क्लासेस का उपयोग करें।
  • जहाँ भी संभव हो, std::stringइसके बजाय का उपयोग करेंchar*
  • समझें और RAII का उपयोग करें

यदि आपका कार्यक्रम छोटा है (और ~ 900 रेखाएँ छोटी लगती हैं) तो मुझे व्यक्तिगत रूप से नहीं लगता है कि कक्षाओं का एक मजबूत सेट बनाने की कोशिश करना आवश्यक है या यहां तक ​​कि उपयोगी भी है।


सलाह के लिए धन्यवाद स्टीवन, हां मुझे कक्षाओं के बारे में एक ही विचार था और मुझे लगता है कि मैं एक साफ सिंगल फाइल में कोड को साफ कर सकता हूं। धन्यवाद!
jwbensley

2

स्वीकार किए गए उत्तर में केवल C को मुहावरेदार C ++ में बदलने के पेशेवरों का उल्लेख है, जैसे कि C ++ कोड C कोड से बेहतर कुछ पूर्ण अर्थों में होगा। मैं अन्य उत्तरों से सहमत हूं कि यदि यह टूटा हुआ नहीं है तो मिश्रित कोड में कोई भी कठोर बदलाव करना शायद अनावश्यक है।

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

इससे पहले कि आप अपने पूरे प्रोजेक्ट को मुहावरेदार C ++ (या C) में फिर से लिखने का निर्णय लें, आपको पता होना चाहिए कि अन्य उत्तरों में प्रस्तुत किए गए कई परिवर्तन आपके प्रोग्राम को धीमा कर सकते हैं, या अन्य अवांछित प्रभावों का कारण बन सकते हैं। उदाहरण के लिए:

  • स्टैक-आवंटित सी-स्ट्रिंग्स को std :: strings में बदलने से अनावश्यक हीप आबंटन हो सकता है
  • कुछ साझा पॉइंटर प्रकारों (जैसे std :: shared_ptr) पर कच्चे पॉइंटर्स को संदर्भ गिनती, आंतरिक वर्चुअल सदस्य कार्यों और थ्रेड सुरक्षा के कारण ओवरहेड तक पहुँच का कारण बनता है
  • मानक पुस्तकालय धाराएँ C समकक्षों की तुलना में धीमी होती हैं
  • कंटेनरों की तरह आरएआई कक्षाओं के लापरवाह उपयोग, अनावश्यक संचालन का कारण बन सकते हैं, खासकर जब सी ++ 11 के शब्दार्थ का उपयोग नहीं किया जा सकता है
  • टेम्पलेट्स लंबे समय तक संकलन समय, अस्पष्ट संकलन त्रुटियों, कोड ब्लोट और संकलक के बीच पोर्टेबिलिटी मुद्दों का कारण बन सकते हैं
  • अपवाद-सुरक्षित कोड लिखना मुश्किल है, जो रूपांतरण के दौरान सूक्ष्म बग को शुरू करना आसान बनाता है
  • प्लेन सी की तुलना में साझा लाइब्रेरी से C ++ कोड का उपयोग करना मुश्किल है
  • C ++ उतने व्यापक रूप से समर्थित नहीं है जितना कि C89

निष्कर्ष निकालने के लिए, मिश्रित C ​​और C ++ कोड से मुहावरेदार C ++ में परिवर्तित करना एक ट्रेडऑफ़ के रूप में देखा जाना चाहिए, जो इसे लागू करने के समय की तुलना में बहुत अधिक है और प्रतीत होता है कि सुविधाजनक सुविधाओं के साथ अपने टूलबॉक्स को बढ़ाता है। इसलिए "यह निर्भर करता है" के अलावा सामान्य मामले के लिए जवाब देना बहुत कठिन है।


"मानक पुस्तकालय धाराएँ C समकक्षों की तुलना में धीमी होती हैं": वैसे भी, निश्चित रूप से प्रिंट की तुलना में अंतर्राष्ट्रीयकरण के लिए कठिन है।
डेडुप्लिकेटर

1

C और C ++ को मिलाना बुरा रूप है। वे अलग-अलग भाषाएं हैं और वास्तव में इस तरह का व्यवहार किया जाना चाहिए। इनमें से जो भी आप सबसे अधिक सहज हों और उस भाषा में मुहावरेदार कोड लिखने का प्रयास करें।

यदि C ++ आपको बहुत सारे कोड सहेज रहा है, तो C ++ से चिपके रहें और C भागों को फिर से लिखें। मुझे संदेह है कि एक प्रदर्शन अंतर भी ध्यान देने योग्य होगा, यदि आप इसके बारे में चिंतित हैं।


इसलिए मेरे पास यह एक पुस्तकालय है जो मैं उपयोग करना चाहता हूं जो कि सी में लिखा गया है, और मेरे पास यह अन्य पुस्तकालय है जो मैं उपयोग करना चाहता हूं जो कि सी ++ में लिखा गया है ... कोड जो ठीक काम करता है उसे फिर से लिखना केवल अनावश्यक काम बना रहा है।
gnasher729

1

मैं हर समय C और C ++ के बीच आगे-पीछे जाता हूं और विषम प्रकार का हूं जो इस तरह से काम करना पसंद करता है। मैं उच्च स्तर की चीजों के लिए C ++ को प्राथमिकता देता हूं, जबकि मैं C को एक ब्लंट इंस्ट्रूमेंट के रूप में उपयोग करता हूं जो मुझे एक्स-रे डेटा प्रकारों की अनुमति देता है और बिट्स और बाइट्स के साथ उनके जैसा व्यवहार करता है, कहते हैं, memcpyजो मुझे निम्न-स्तरीय डेटा संरचनाओं और मेमोरी एलोकेटर्स को लागू करने के लिए आसान लगता है । यदि आप अपने आप को कच्चे बिट्स और बाइट्स के स्तर पर काम कर रहे हैं, तो C ++ की वास्तव में समृद्ध प्रकार की प्रणाली कुछ भी मदद नहीं करती है, और मुझे अक्सर सी में ऐसे कोड लिखना आसान लगता है जहां मैं सुरक्षित रूप से मान सकता हूं कि मैं कर सकता हूं किसी भी C डेटा प्रकार को बिट्स और बाइट्स के रूप में समझें।

ध्यान रखने वाली मुख्य बात यह है कि इन दोनों भाषाओं में अच्छी तरह से जाली नहीं है।

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

2. यदि आप C कोड लिखते हैं जो डेटा प्रकारों को सिर्फ कच्चे बिट्स और बाइट्स के रूप में मानता है, तो टाइप सिस्टम पर बुलडोज़िंग (यह वास्तव में पहली जगह में सी का उपयोग करने का मेरा मुख्य कारण है), तो आप कभी भी C ++ डेटा के खिलाफ ऐसे कोड का उपयोग नहीं करना चाहते हैं प्रकार जो कॉपी कंस्ट्रक्टर और डिस्ट्रक्टर्स और वर्चुअल पॉइंटर्स और उस तरह की चीजों को कॉपी कर सकते थे, जिनका सम्मान किया जाना आवश्यक है। तो आम तौर पर यह इस तरह के सी कोड का उपयोग करके सी कोड होना चाहिए, न कि इस तरह के सी कोड का उपयोग करके सी ++ कोड।

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

क्या मुझे इसे C ++ में फिर से लिखना चाहिए (इसका मतलब है कि मैं और अधिक C ++ ऑब्जेक्ट्स और विधियों को लागू करता हूं जहां शायद मैंने C शैली में कुछ कोडित किया है जिसे नए C ++ तकनीकों का उपयोग करके संघनित किया जा सकता है), या स्ट्रिंग स्ट्रीप ऑब्जेक्ट्स का उपयोग हटा दें यह सब "वापस" सी कोड के लिए ले आओ?

मेरी राय में अगर आपको ऊपर दिए गए नियमों का पालन करना है तो आपको परेशान नहीं होना चाहिए और सुनिश्चित करें कि आपके द्वारा लिखे गए परीक्षणों के खिलाफ आपका कोड अच्छी तरह से परीक्षण किया गया है। जो हिस्सा सुधारने लायक हो सकता है वह वह कोड है जो आपने C ++ में अब तक लिखा है, लेकिन इसका मतलब यह नहीं है कि आपको उस कोड को पोर्ट करना होगा जो C ++ पर सख्ती से आधारित है।

कोड के साथ आपने C ++ में लिखा है और C ++ कोड के रूप में संकलित किया है, वहां आपको सावधान रहना होगा। C ++ में C- जैसे कोडिंग का उपयोग करना परेशानी के लिए पूछ रहा है। उदाहरण के लिए, यदि आप मैन्युअल रूप से आवंटित और नि: शुल्क संसाधनों को मैन्युअल रूप से आवंटित करते हैं, तो संभावना है कि आपका कोड अपवाद-सुरक्षित नहीं है क्योंकि आपका कोड एक अपवाद का सामना कर सकता है जिस बिंदु पर आप कार्य से पहले कभी freeभी संसाधन से बाहर निकल सकते हैं । C ++ में, RAII और स्मार्ट पॉइंटर्स जैसी चीजें एक शानदार सुविधा नहीं हैं क्योंकि वे दिखाई दे सकते हैं यदि आप केवल असाधारण निष्पादन पथों पर विचार किए बिना सामान्य निष्पादन पथ को देखते हैं। वे अक्सर सही और सुरक्षित रूप से सही अपवाद-सुरक्षित कोड लिखने के लिए एक मौलिक आवश्यकता रखते हैं जो अपवाद का सामना करते समय सभी जगह लीक करना शुरू नहीं करेंगे।

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