C ++ से C अलग कैसे है?


21

कई लोगों ने कहा है कि C ++ C की तुलना में पूरी तरह से अलग भाषा है, लेकिन Bjarne ने खुद कहा है कि C ++ एक ऐसी भाषा है जिसे C से बढ़ाया जाता है, इसलिए यह वही है जहां से ++आती है। तो हर कोई यह क्यों कहता रहता है कि C और C ++ पूरी तरह से अलग-अलग भाषाएँ हैं? C ++ में विस्तारित सुविधाओं के अलावा C ++ से किस तरह अलग है?


3
कैसे उनका उपयोग किया जाता है। आप निश्चित रूप से C को C ++ में लिख सकते हैं ... लेकिन आपको नहीं करना चाहिए।
एड एस।

जवाबों:


18

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

इसके अतिरिक्त, C और C ++ के बीच के तकनीकी अंतर ने उन भाषाओं में विशिष्ट मुहावरे बना दिए हैं और जिन्हें 'अच्छा अभ्यास' माना जाता है।

यह लोगों को यह कहने के पीछे की प्रेरणा है कि "सी / सी ++ जैसी कोई भाषा नहीं है" या "सी और सी ++ दो अलग-अलग भाषाएं हैं"। यद्यपि यह उन प्रोग्रामों को लिखना संभव है जो सी और सी ++ संकलक दोनों के लिए स्वीकार्य हैं, कोड को आमतौर पर न तो अच्छे सी कोड का उदाहरण माना जाता है और न ही अच्छे सी ++ कोड का उदाहरण।


मुझे नहीं लगता कि पहला पैराग्राफ सही है। मेरा मानना ​​है कि C का हमेशा से ही निहितार्थ था void *लेकिन C ++ ने कभी ऐसा नहीं किया। (नीचे नहीं किया गया)
वैकल्पिक

5
@mathepic: "हमेशा" परिभाषित करें। C ने C ++ से शून्य * प्रकार लिया। K & R C में, मलोक चार * लौट रहा था
निमन्जा ट्रिफ़ुनोविक

19

स्ट्रॉस्ट्रुप खुद जवाब देता है कि उसके अक्सर पूछे जाने वाले प्रश्न में :

C ++ C का सीधा वंशज है जो एक सबटेट के रूप में C के लगभग सभी को बनाए रखता है। C ++ C की तुलना में अधिक मजबूत प्रकार की जाँच प्रदान करता है और सीधे C की तुलना में प्रोग्रामिंग शैलियों की एक विस्तृत श्रृंखला का समर्थन करता है। C ++ इस अर्थ में "एक बेहतर C" है कि यह C का उपयोग करते हुए प्रोग्रामिंग की शैलियों का समर्थन करता है जो बेहतर प्रकार की जाँच और अधिक नोटिफ़िकेशन समर्थन (बिना हानि के) करता है। दक्षता)। इसी अर्थ में, ANSI C, K & R C. से बेहतर C है। इसके अलावा, C ++ डेटा एब्स्ट्रक्शन, ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग और जेनेरिक प्रोग्रामिंग का समर्थन करता है।

यह ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग और जेनेरिक प्रोग्रामिंग के लिए समर्थन है जो C ++ को "पूरी तरह से अलग" बनाता है। आप लगभग शुद्ध C लिख सकते हैं और फिर इसे C ++ कंपाइलर (जब तक आप सख्त टाइप चेकिंग का ध्यान रखते हैं) के साथ संकलित कर सकते हैं। लेकिन तब आप अभी भी C लिख रहे हैं - आप C ++ नहीं लिख रहे हैं।

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


"ऐसा कुछ नहीं है जो आप सी में देखेंगे।" यह वाक्यांश अजीब लगता है! "सी में देखें"। C में C! यह एक तरह की कविता है।
गैलेक्सी

13

सीधे शब्दों में कहें, तो C में मुहावरेदार माना जाता है निश्चित रूप से C ++ में मुहावरेदार नहीं है।

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

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


4
यह नहीं है कि सी-स्टाइल कोड सी ++ में गैर-मुहावरेदार है। सी-स्टाइल कोडिंग वास्तव में सी ++ में समस्याग्रस्त है, अपवाद सुरक्षा की कमी के कारण।
dan04

4

इस तथ्य के अलावा कि C ++ ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग का समर्थन करता है, मुझे लगता है कि आपके पास यहाँ अपना उत्तर है: http://en.wikipedia.org/wiki/Compatibility_of_C_and_C++

उस लेख में सामान दिखाने वाले कोड उदाहरण हैं जो C में ठीक है लेकिन C ++ में नहीं है। उदाहरण के लिए:

int *j = malloc(sizeof(int) * 5); /* Implicit conversion from void* to int* */

C प्रोग्राम को C ++ में पोर्ट करना अक्सर सीधा होता है और इसमें ज्यादातर कंपाइलिंग एरर फिक्सिंग होती है (कास्ट, नए कीवर्ड आदि जोड़ना)।


4
एक प्रोग्राम को पोर्ट करना जैसे कि आपको C ++ प्रोग्राम नहीं देता है। यह आपको C देता है जिसे C ++ कंपाइलर पर संकलित किया जा सकता है। यह इसे सी ++ नहीं बनाता है (मैं अभी भी परिणामी कोड सी (कक्षाओं के साथ सी भी नहीं) कहूंगा)।
मार्टिन यॉर्क

@MartinYork इसे बुरा C कहें, शब्दार्थ अलग हो सकता है, और मैं सहमति व्यक्त करता हूं। हालांकि परिणाम स्पष्ट रूप से सी है।
डिडुप्लिकेटर

2

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


2

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


क्या आप C ++ में C के पास नहीं है और अधिक उपयोगी सुविधाओं में से एक का उदाहरण प्रस्तुत कर सकते हैं?
डार्क टमप्लर

2
@DarkTemplar: RAII के साथ आसान-मोड संसाधन प्रबंधन के बारे में कैसे? या टेम्पलेट्स का उपयोग कर अच्छा सामान्य डेटा संरचनाएं? बस शुरू करने के लिए।
डेडएमजी

1

अंतर यह है कि सी में आप प्रक्रियात्मक रूप से सोचते हैं और सी ++ में आप एक वस्तु उन्मुख तरीके से सोचते हैं। भाषाएं काफी समान हैं लेकिन दृष्टिकोण बहुत अलग है।


क्या C में भी संरचना नहीं है? C स्वयं को अलग-अलग मॉड्यूल (मूल रूप से, ऑब्जेक्ट्स) की फाइलें नहीं हैं? निश्चित नहीं है कि प्रक्रियात्मक और वस्तु-उन्मुख के बीच सटीक अंतर क्या है ...
डार्क टमप्लर

1
डार्क तुम मेरी बात सचित्र है। यह उस भाषा की सीमा नहीं है जो आपको प्रक्रियात्मक रूप से या ऑब्जेक्ट-ओरिएंटेड तरीके से लिखने की अनुमति देती है, यह एक लोकाचार या सोचने का तरीका है।
चींटी

0

जबकि C ++ सिंथैटिक शब्दों में C का सुपर सेट हो सकता है - यानी C प्रोग्राम का कोई भी निर्माण C ++ कंपाइलर द्वारा संकलित किया जा सकता है।

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

वर्तमान पोस्ट की बात यह है कि C ++ में निम्नलिखित विशेषताएं हैं कि एक अच्छे C ++ प्रोग्रामर को प्रोग्रामिंग की सर्वोत्तम प्रथाओं के रूप में उपयोग करना चाहिए, भले ही C समतुल्य संकलन करना संभव हो।

इसे C ++ ओवर C में कैसे किया जाना चाहिए

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

  2. निजीकरण - कक्षाएं, और यहां तक ​​कि संरचनाओं में निजी सदस्य हैं। यह एक वर्ग का एनकैप्सुलेशन संभव बनाता है। C के समतुल्य है वस्तु को टाइप करने के लिए void * को एप्लीकेशन के रूप में टाइप करना ताकि एप्लिकेशन को आंतरिक वैरिएबल तक पहुंच न हो। हालाँकि, C ++ में आप सार्वजनिक के साथ-साथ निजी कक्षाओं के भी तत्व रख सकते हैं।

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

  4. नए और नष्ट बनाम मॉलॉक और मुफ्त। नए () और डिलीट () स्टेटमेंट्स न केवल मेमोरी को आवंटित और डी-आवंटित करते हैं, बल्कि कोड को विनाश-एर के हिस्से के रूप में निष्पादित करने की अनुमति देते हैं जिन्हें एक श्रृंखला में कहा जाता है। यदि आप C ++ का उपयोग कर रहे हैं - यह वास्तव में मॉलॉक और मुफ्त का उपयोग करने के लिए बीएडी है।

  5. IO प्रकार और ऑपरेटर ओवरलोडिंग ऑपरेटर ओवरलोडिंग अच्छी तरह से किए जाने पर कोड को पठनीय या अधिक सहज बनाते हैं। << और >> io ऑपरेटरों के लिए भी। ऐसा करने का C तरीका फ़ंक्शन पॉइंटर्स का उपयोग करना होगा - लेकिन यह गड़बड़ है और केवल अग्रिम प्रोग्रामर के लिए है।

  6. "स्ट्रिंग" का उपयोग करना। C से चर * हर जगह काम करता है। तो C और C ++ बहुत अधिक है। हालाँकि, यदि आप C ++ में हैं - तो स्ट्रिंग वर्गों का उपयोग करना हमेशा बेहतर (और सुरक्षित) होता है, जो आपको रनिंग पर सरणियों के खतरों से बचाता है, जो लगभग हर चीज़ हैं।

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

  1. स्मार्ट पॉइंटर्स - हाँ, वे बहुत स्मार्ट हैं! और ज्यादातर स्मार्ट चीजों की तरह - वे अच्छे से शुरू होते हैं और बाद में गड़बड़ हो जाते हैं! मुझे इस्तेमाल करना पसंद नहीं है

चीजें जो मुझे C के बारे में पसंद हैं और C ++ में याद आती हैं

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

  2. सरल सूत्र। जब आप थ्रेड बनाते हैं तो थ्रेड्स होते हैं - यह काफी सरल और प्रबंधनीय होता है। यह तब होता है जब आपको ऐसे धागे बनाने की आवश्यकता होती है जो कक्षाओं के लिए "निजी" माना जाता है (ताकि उनकी निजी सदस्यों तक पहुंच हो)। नहीं है बढ़ावा बुनियादी सी में लेकिन कुछ भी ++ - चौखटे के प्रकार।

Dipan।


0

कुछ भाषा सुविधाएँ, भले ही वे परिवर्धन हैं, पूरे तरीके को बदल सकती हैं, जिस भाषा को व्यावहारिक रूप से उपयोग करने की आवश्यकता है। जैसा कि एक उदाहरण इस मामले पर विचार करता है:

lock_mutex(&mutex);

// call some functions
...

unlock_mutex(&mutex);

अगर C ++ में लागू किए गए उपरोक्त कोड में कॉलिंग फ़ंक्शन शामिल हैं, तो हम परेशानी की दुनिया के लिए हो सकते हैं, क्योंकि उन फ़ंक्शन कॉल में से कोई भी एक फेंक सकता है और हम उन असाधारण पथों में म्यूटेक्स को कभी भी अनलॉक नहीं करेंगे।

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

void f(const Foo* f1)
{
    Foo f2;
    memcpy(&f2, f1, sizeof f2);
    ...
}

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

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

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

मैं C ++ का अधिक से अधिक बार एहसान करता हूं, लेकिन मुझे वास्तव में व्यापक रूप से द्विआधारी संगतता (और FFIs) के लिए C API का उपयोग करने की आवश्यकता है, हालांकि मैं अक्सर हेडर के लिए C का उपयोग करने के बावजूद उन्हें C ++ में कार्यान्वित करता हूं। लेकिन कभी-कभी जब आप वास्तव में निम्न-स्तर पर जाते हैं, जैसे मेमोरी एलोकेटर के स्तर या बहुत कम-स्तरीय डेटा संरचना (और मुझे यकीन है कि एम्बेडेड प्रोग्रामिंग करने वालों के बीच और उदाहरण हैं), तो यह कभी-कभी मददगार हो सकता है यह मानने में सक्षम है कि आप जिस प्रकार और डेटा के साथ काम कर रहे हैं वे vtables, costructors, और destructors जैसी कुछ विशेषताओं से अनुपस्थित हैं, ताकि हम उन्हें बिट्स और बाइट्स के रूप में चारों ओर फेरबदल करने, कॉपी करने, मुक्त करने, वास्तविक बनाने के लिए व्यवहार कर सकें। विशेष रूप से निम्न-स्तरीय समस्याओं के लिए, यह कभी-कभी बहुत सरल प्रकार की प्रणाली के साथ काम करने में सहायक हो सकता है जो C प्रदान करता है,

एक स्पष्टता

यहाँ एक दिलचस्प टिप्पणी मैं गहराई से थोड़ा और जवाब देना चाहता था (मुझे लगता है कि यहाँ टिप्पणियाँ वर्ण सीमा पर इतनी सख्त हैं):

memcpy(&f2, f1, sizeof f2); अगर सी में फू का अपना कोई संकेत है, या उससे भी बदतर है, तो सी में "नरकंकाल शासनकाल" भी है, क्योंकि आपके पास इससे निपटने के लिए उपकरणों की भी कमी है।

यह एक उचित बिंदु है लेकिन मैं जिस चीज पर ध्यान केंद्रित कर रहा हूं वह मुख्य रूप से C ++ की टाइप प्रणाली पर ध्यान केंद्रित करने के साथ-साथ RAII के संबंध में है। कारणों में से एक ऐसे एक्स-रेईश बाइट-कॉपीिंग memcpyया qsortफ़ंक्शन के प्रकार सी में व्यावहारिक खतरे को कम करते हैं, यह है कि ऊपर f1और f2ऊपर का विनाश स्पष्ट है (यदि उन्हें गैर-तुच्छ विनाश की आवश्यकता है), जबकि जब विनाशकारी तस्वीर में चले जाते हैं , वे अंतर्निहित और स्वचालित हो जाते हैं (अक्सर डेवलपर्स के लिए महान मूल्य के साथ)। यह भी vptrs की तरह छिपे हुए राज्य का उल्लेख नहीं है और आगे जो इस तरह के कार्यों सही पर बुलडोज़र होगा। यदि f1सूचक औरf2उथले उन्हें कुछ अस्थायी संदर्भ में कॉपी करते हैं, तो यह कोई समस्या नहीं है अगर हम दूसरी बार उन मालिक बिंदुओं को स्पष्ट रूप से मुक्त करने की कोशिश नहीं करते हैं। C ++ के साथ यह कुछ ऐसा है जो कंपाइलर स्वचालित रूप से करना चाहेगा।

और अगर सी में "आम तौर पर" अगर फू के पास पॉइंटर्स होते हैं , तो यह अधिक बड़ा हो जाता है , क्योंकि संसाधन प्रबंधन के साथ जरूरी गवाह अक्सर ऐसा बनाते हैं कि आमतौर पर अनदेखी करने के लिए कुछ और अधिक कठिन होता है जबकि सी ++ में, हम एक यूडीटी को लंबे समय तक बना सकते हैं। constructible / ध्वंसशील केवल यह किसी भी सदस्य चर जो trivially constructible / ध्वंसशील नहीं है की दुकान बनाने (एक तरह से आम तौर पर बहुत उपयोगी है कि, फिर से, लेकिन नहीं हम की तरह उपयोग कार्यों के लिए परीक्षा रहे हैं द्वारा memcpyया realloc)।

मेरा मुख्य बिंदु इस खोजकर्ता के किसी भी लाभ पर बहस करने की कोशिश नहीं करना है (मैं कहूंगा कि यदि कोई हो, तो वे लगभग हमेशा मानव त्रुटि की बढ़ती संभावना के विपक्ष द्वारा तौला जाता है जो इसके साथ आता है), लेकिन केवल यह कहने के लिए कि कार्यों की तरह memcpyऔर memmoveऔर qsortऔर memsetऔरreallocऔर इसके बाद UDTs के साथ एक भाषा में कोई जगह नहीं है जो C ++ जैसी सुविधाओं और क्षमताओं में समृद्ध है। हालांकि वे परवाह किए बिना मौजूद हैं, मुझे लगता है कि यह कहना भी बहुत मुश्किल नहीं होगा कि सी ++ डेवलपर्स के विशाल, विशाल बहुमत प्लेग जैसे कार्यों से बचने के लिए बुद्धिमान होंगे, जबकि ये सी में बहुत दैनिक प्रकार के कार्य हैं, और मैं ' डी का तर्क है कि वे सी में कम समस्याओं को सरल कारण से बताते हैं कि इसकी प्रकार प्रणाली बहुत अधिक बुनियादी है और, शायद "डम्बर"। एक्स-रे सी प्रकार और उन्हें बिट्स और बाइट्स के रूप में व्यवहार करना त्रुटि-प्रवण है। C ++ में ऐसा करना यकीनन सिर्फ एक दम गलत है क्योंकि इस तरह के कार्य भाषा की बहुत बुनियादी विशेषताओं के खिलाफ लड़ रहे हैं और यह किस प्रकार की प्रणाली को प्रोत्साहित करता है।

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

लेकिन आप जानते हैं, मैं एक व्यावहारिक (या कम से कम मैं प्रयास करता हूं)। यदि C यह सबसे बेईमानी और ईश्वरीय, त्रुटि-प्रवण, गंदी भाषा थी, तो मेरे C ++ उत्साही साथियों में से कुछ ने इसका दावा किया (और मैं अपने आप को C ++ उत्साही मानूंगा, सिवाय इसके कि किसी भी तरह इस हिस्से पर C की घृणा न हो। ; इसके विपरीत इसका मुझ पर विपरीत प्रभाव पड़ा, जिससे मुझे दोनों भाषाओं को अपने-अपने मामलों में और मतभेदों से बेहतर तरीके से सराहना मिली), तो मैं उम्मीद करूंगा कि वास्तविक दुनिया में कुछ बुग्गीस्ट और लीकस्टी के रूप में दिखाने के लिए और अविश्वसनीय उत्पाद और पुस्तकालय सी में लिखे जा रहे हैं और मुझे वह नहीं मिलता है। मुझे लिनक्स पसंद है, मुझे Apache, Lua, zlib पसंद है, मैं इस तरह की शिफ्टिंग हार्डवेयर आवश्यकताओं, Gimp, libpng, Cairo, इत्यादि के खिलाफ अपनी लंबी विरासत के लिए OpenGL सहनीय पाता हूं। कम से कम जो कुछ भी भाषा की बाधा बनती है, वह यह प्रतीत नहीं होती है कि जहां तक ​​सक्षम हाथों में कुछ शांत पुस्तकालयों और उत्पादों को लिखने की बात है, और यही वास्तव में मेरी दिलचस्पी है। इसलिए मैं कभी भी इस प्रकार नहीं हूं जो सबसे अधिक भावुक है। भाषा की लड़ाई, एक व्यावहारिक अपील करने के अलावा और कहते हैं, "अरे, वहाँ शांत सामान है! आइए जानें कि उन्होंने इसे कैसे बनाया और शायद शांत पाठ हैं, भाषा के मुहावरे की प्रकृति के लिए इतना विशिष्ट नहीं है कि हम वापस ला सकें। हम जिस भी भाषा (भाषाओं) का उपयोग कर रहे हैं। " :-D


2
memcpy(&f2, f1, sizeof f2);सी में "जहन्नुम का कहर" Fooभी है, अगर किसी के पास कोई संकेत है, या इससे भी बदतर है, क्योंकि आपके पास इससे निपटने के लिए उपकरणों की भी कमी है। इसलिए C लिखने वाले लोग ऐसा कुछ नहीं करते
Caleth

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

@ कैलेथ यह मेरे हिस्से में एक आलस्य की बात है क्योंकि यदि Fooकिसी के पास कोई संकेत है, तो हम इसे एक उचित प्रति / चाल ctor, dtor, उपयोग मूल्य शब्दार्थ, इत्यादि दे सकते हैं, और इसमें अधिक समृद्ध और सुरक्षित कोड है। लेकिन कभी-कभी मैं खुद को ऐसे मामलों में सी तक पहुंचने के लिए पाता हूं जहां मैं बिट्स और बाइट्स के सजातीय स्तर पर एक डेटा संरचना या आवंटन को सामान्य बनाना चाहता हूं, कुछ मान्यताओं के साथ मैं उन प्रकारों पर बना सकता हूं जो उनके संकीर्ण उपयोग के मामलों में, सरल होते हैं। इस तरह की धारणाओं से थोड़ा मैं सी में बनाने के लिए थोड़ा अधिक आत्मविश्वास महसूस करता हूं
ड्रैगन एनर्जी

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

दूसरा मामला जहां मैं कभी-कभी C के लिए पहुंचता हूं, ऐसे मामले होते हैं जहां कोड वास्तव में कम अमूर्त होने और प्राइमेटिव पर ध्यान केंद्रित करके पुन: सामान्यीकृत और पुन: प्रयोज्य हो सकता है, जैसे API void filter_image(byte* pixels, int w, int h);कि एक साधारण उदाहरण जैसे कि विरोध करना API void filter_image(ImageInterface& img);(जो हमारे कोड को ऐसे छवि इंटरफ़ेस में जोड़ेगा, आदि। इसकी प्रयोज्यता को कम करना)। ऐसे मामलों में मैं कभी-कभी ऐसे कार्यों को C में लागू करता हूं क्योंकि C ++ में बहुत कम प्राप्त होता है, और यह इस संभावना को कम कर देता है कि ऐसे कोड को भविष्य में बदलाव की आवश्यकता होगी।
ड्रैगन एनर्जी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.