C ++ पर कोई भी C का उपयोग क्यों करेगा? [बन्द है]


132

हालाँकि लोग C ++ के बारे में शिकायत करना पसंद करते हैं, लेकिन मुझे इस बात का ज्यादा सबूत नहीं मिल पाया है कि आप C ++ पर C क्यों चुनना चाहेंगे। सी लगभग flak नहीं लगता है और अगर C ++ में ये सभी समस्याएं हैं तो आप खुद को C सबसेट में सीमित क्यों नहीं कर सकते? आपके विचार / अनुभव क्या हैं?


सटीक डुप्लिकेट लिंक अब काम नहीं करता है ..... उस व्यक्ति का कहना है जो सी पार्टी के लिए देर से है :)
काइल

4
C वास्तव में C ++ से बेहतर और सरल है लेकिन कोई भी C प्रोग्रामर C ++ को C और हंसी में परिवर्तित कर सकता है।
BobRun

11
भयावह बात यह है कि लोग सामान्य रूप से "++" का अर्थ है कि यह वास्तव में gooooood है, अच्छी तरह से खेद है कि यह नहीं है।
BobRun

स्पष्ट - छोटे / एम्बेडेड उपकरणों के अलावा - आम तौर पर सी शुद्ध संख्या की कमी की समस्याओं (जैसे GPU ग्राफिक्स प्रसंस्करण, बड़े पैमाने पर समानांतर भौतिकी गणना, पैटर्न खनन आदि) के लिए बेहतर है जहां ओओपी विशेषताएं एक ब्लोट हैं। C ++ मॉडलिंग सिस्टम के लिए बेहतर है जहां 'चीजें' इंटरैक्ट करती हैं, OOP क्षमताओं के साथ बहुत आसान है।
पेसमैन

3
क्योंकि जावास्क्रिप्ट, सर्वोत्तम प्रथाओं, सी ++, और ओओपी बेवकूफ / बहुत व्यस्त हैं जो इन अमूर्त समस्याओं को हल करने की कोशिश कर रहे हैं जो शायद वास्तव में मौजूद नहीं हैं या जिन्हें कभी हल करने की आवश्यकता है।
मार्शल शिल्प

जवाबों:


132

जोएल के जवाब कारणों के लिए अच्छा है आप हो सकता है है , हालांकि कुछ और हैं, सी का उपयोग करें:

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

हालाँकि, कुछ मामलों में, आप C ++ के बजाय C का उपयोग करना चाह सकते हैं :

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

आप अनुमान लगाते हैं कि आप सी उपसमुच्चय का उपयोग कर सकते हैं और C ++ संकलक के साथ संकलित कर सकते हैं, लेकिन आप पाएंगे कि यदि आप ऐसा करते हैं तो आपको संकलक के आधार पर थोड़े अलग परिणाम मिलेंगे।

भले ही, यदि आप ऐसा कर रहे हैं, तो आप सी का उपयोग कर रहे हैं। क्या आपका प्रश्न वास्तव में "C प्रोग्रामर C ++ कंपाइलर का उपयोग क्यों नहीं करते?" यदि यह है, तो आप या तो भाषा के अंतर को नहीं समझते हैं, या आप संकलक सिद्धांत को नहीं समझते हैं।


2
MISRA C मानक भी है, जो AFAIK अभी तक C ++ के लिए वास्तव में स्थिर नहीं है।
पॉल नाथन

60
प्रदर्शन हिस्सा जरूरी सच नहीं है। ऐसे बहुत से क्षेत्र हैं जहाँ C ++, C से बेहतर अनुकूलन कर सकता है (बेशक रिवर्स कभी-कभार सच भी होता है, लेकिन आम तौर पर, प्रदर्शन कारणों से C ++ पर C चुनना एक बुरा विचार है)।
जलफ

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

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

21
@ एडम: सी ++ "सुंदर" कोड के साथ सी से बेहतर प्रदर्शन करता है। C ++ टेम्प्लेट और इनलाइन फ़ंक्शन का उपयोग कर सकता है जहां C को मैक्रो की आवश्यकता होती है। C ++ ओवरहेड केवल तब ही दिखाई देता है, जब यह पूछा जाता है, यह अन्यथा C. (वर्चुअल, ट्राइ / थ्रो, डायनेमिक_कास्ट) के समान है। ओवरहेड का ज्यादातर हिस्सा केवल प्रोग्राम इमेज साइज में दिखता है।
ज़ैन लिंक्स

88

मुझे अतिसूक्ष्मवाद और सादगी पसंद है।


9
ठीक है - पर्याप्त निष्पक्ष ... तो क्यों नहीं फोर्थ?
जोनाथन लेफ़लर

14
मुझे लगता है कि वह पुस्तकालयों, पुस्तकों, मंचों को उपलब्ध होना पसंद करता है?
ग्नुद

30
मुझे आपके उत्तर की अतिसूक्ष्मवाद और सरलता पसंद है ... :)
जो डीएफ

8
इस बात से सहमत। सी बहुत सरल और "छोटा" है। C हमेशा एक जैसा दिखता है और यदि आप किसी प्रोजेक्ट में नए योगदानकर्ता हैं, तो यह समझना आसान है कि यह कैसे काम करता है। c ++ में कुछ बेकार चीजें हैं और जब c ++ प्रोजेक्ट को देखता हूं तो मैं तुरंत भ्रमित हो जाता हूं। मैं c ++ लोगों (OO क्षमताओं वाली C भाषा) को समझ सकता हूं लेकिन C केवल अधिक सरल और आसान है।
user69969

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

65
  • क्योंकि वे पहले से ही सी जानते हैं
  • क्योंकि वे एक प्लेटफ़ॉर्म के लिए एक एम्बेडेड ऐप बना रहे हैं जिसमें केवल सी कंपाइलर है
  • क्योंकि वे सी में लिखे गए विरासत सॉफ्टवेयर को बनाए रख रहे हैं
  • आप एक ऑपरेटिंग सिस्टम, एक रिलेशनल डेटाबेस इंजन या एक खुदरा 3 डी वीडियो गेम इंजन के स्तर पर कुछ लिख रहे हैं।

4
कुछ माइक्रोकंट्रोलर्स के पास केवल सी कंपाइलर होते हैं जो वास्तव में बेकार होते हैं। बुनियादी सी ++ फीचर्स (नाम स्थान, वर्चुअल फ़ंक्शंस के अलावा क्लासेस, एनम, वेरिएबल घोषित करने के अलावा कहीं और टॉप-ऑफ-ब्लॉक) सबसे मूल्यवान हैं, IMHO।
जेसन एस

2
इससे यह लगता है कि आप सी का चयन तभी करेंगे जब कोई उचित विकल्प न हो।

2
@ जो: पहले बिंदु से अलग, यह रकम के बारे में। बहुत बाद की भाषाओं ने सी लिया और कहा, 'हे, हम बेहतर कर सकते हैं ।'
जोएल कोएहॉर्न

1
माना। यदि आप परिष्कृत C ++ सुविधाओं का उपयोग नहीं कर रहे हैं, तो मेरा मानना ​​है कि C ++ एक बेहतर सी है। बेहतर परिष्कृत C ++ सुविधाओं के साथ, चीजें अधिक विवादित हो जाती हैं, लेकिन फिर बहस आमतौर पर अमूर्तता के उच्च स्तर पर होती है- जैसे, जावा।
पॉल नाथन

4
अधिकांश 3D गेम इंजन वास्तव में C ++ का उपयोग करते हैं। UE4 ज्यादातर C ++ का उपयोग करता है।
आदित्य काशी

56

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

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

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

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

विक्रेताओं के लिए अनुकूलता की बात भी है। जबकि C में एक स्थिर और अच्छी तरह से परिभाषित ABI (एप्लिकेशन बाइनरी इंटरफ़ेस) C ++ नहीं है। C ++ में ABI ऐसी चीज़ों के कारण अधिक जटिल है, जैसे vtables और constructurs / destructors इसलिए इसे प्रत्येक विक्रेता के साथ अलग-अलग तरीके से लागू किया जाता है, और एक विक्रेता टूलकिन के संस्करण भी।

वास्तविक अर्थों में इसका मतलब है कि आप एक संकलक द्वारा बनाई गई लाइब्रेरी नहीं ले सकते हैं और इसे कोड या किसी अन्य पुस्तकालय से जोड़ सकते हैं जो वितरित परियोजनाओं या बाइनरी पुस्तकालयों के मिडलवेयर प्रदाताओं के लिए एक बुरा सपना बनाता है।


7
"व्याख्या की गई पायथन कई मायनों में" धीमी "भाषा मानी जाती है, लेकिन गैर-तुच्छ कार्यों के लिए एक कुशल पायथन प्रोग्रामर आसानी से कोड का उत्पादन कर सकता है जो अनुभवहीन सी डेवलपर की तुलना में तेजी से निष्पादित होता है।" मुझे लगता है कि एक प्रोग्रामर (जरूरी नहीं कि पायथन प्रोगैमर) जो एल्गोरिदम का सबक लेता है वह कोड का उत्पादन कर सकता है जो अनुभवहीन डेवलपर (सामान्य रूप से) की तुलना में तेजी से निष्पादित होता है।
आंद्रेई सिओबानु

15
और वही अनुभवहीन सी देव अपने सी कोड की तुलना में धीमा है कि अजगर कोड का उत्पादन होगा। अजगर, सी की तुलना में धीमा है।
मिल्ली स्मिथ

37

मैं सी में लिखना चुनता हूं क्योंकि मुझे छोटी, तंग भाषा के साथ काम करने में मजा आता है। मुझे एक मानक तक पहुंच प्राप्त करना पसंद है जिसे उचित समय में पढ़ा जा सकता है (मेरे लिए - मैं बहुत धीमा पाठक हूं)। इसके अलावा, मैं इसका उपयोग एम्बेडेड सिस्टम के लिए सॉफ्टवेयर लिखने के लिए करता हूं जिसके लिए कुछ वांछनीय C ++ कंपाइलर मौजूद हैं (जैसे कि कुछ PIC माइक्रो-कंट्रोलर)।


पुन: PICs - मुझे आपका दर्द महसूस हो रहा है। अगर मुझे कभी बहुत सारे PIC कोड करने होते हैं तो मैं शायद IAR कंपाइलर का उपयोग करूंगा जो C ++ को सपोर्ट करता है। मैंने इसे MSP430 पर इस्तेमाल किया है और यह बहुत अच्छा है।
जेसन एस

1
और सी। कोई टेम्प्लेट सिस्टम के लिए बहुत बेहतर रूप से संकलित समय को मत भूलना।
इंजीनियर

35

मैं अन्य दृष्टिकोण लेता हूं: सी के बजाय सी ++ का उपयोग क्यों करें?

सी प्रोग्रामिंग लैंग्वेज (उर्फ: के एंड आर) पुस्तक आपको स्पष्ट रूप से बताती है कि 300 पृष्ठों के तहत भाषा क्या कर सकती है। यह अतिसूक्ष्मवाद की एक उत्कृष्ट कृति है। कोई C ++ बुक भी पास नहीं आती है।

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


मैं सहमत हूँ। मुझे पॉवर चाहिए इसलिए मैं 1/2 प्वॉइंट पॉइंट नहीं बल्कि कुछ सही मायने में पावरफुल इस्तेमाल करता हूं।
दिनाह

7
@ दीना: 1/2 रास्ता बिंदु आपको सी # या जावा के प्रदर्शन और मेमोरी लागत के बिना उच्च स्तरीय अभिव्यक्ति शक्ति देता है।
ज़ैन लिंक्स

5
@Zan लिंक्स: आप सही कह रहे हैं। लेकिन मुझे उम्मीद है कि मैंने अपने मूल पोस्ट में जो विरोध किया था, उसे लेकर मैंने C C की व्यवहार्यता के बारे में एक बिंदु बनाया था ... भले ही वह एक खुला और बंद मामला न हो।
दीना

28

पहले से उल्लिखित कई अन्य बिंदुओं के अलावा:

कम आश्चर्य

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

कई मामलों में यह जादू अच्छा है, लेकिन उदाहरण के लिए रियल-टाइम सिस्टम में यह वास्तव में आपके दिन को खराब कर सकता है।


27

आपके सवाल का लिनस का जवाब है "क्योंकि C ++ एक भयानक भाषा है"

उसका सबूत सबसे अच्छा है, लेकिन वह एक बिंदु है ..

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

लिंक जोड़ना:

क्यों सी ++ एम्बेडेड के लिए

आप अभी भी C का उपयोग क्यों कर रहे हैं? पीडीएफ

मैं इसके लिए गूगल करूंगा .. क्योंकि वेब पर पहले से ही काफी कमेंट्री हैं


17
मैंने C में बहुत सी कोडिंग की, फिर C ++ में कुछ समय के लिए, फिर VB के साथ एक लंबे समय के लिए, और अब मैं पिछले कुछ वर्षों से C # का उपयोग कर रहा हूं। मैंने तब से C और C ++ कोड को थोड़ा लिखा है और मुझे एहसास हुआ है कि C अच्छी तरह से परिभाषित और तंग है, C # शांत और शक्तिशाली है, और C ++ सिर्फ चूसता है।
CMPalmer

25
लिनस वास्तव में C ++ के गुणों के बारे में बोलने के लिए योग्य नहीं है। उसे उद्धृत करते हुए मानो वह किसी प्रकार का तांडव कर रहा हो। और "मुश्किल काम करने के तरीके" के बारे में थोड़ा समझ में नहीं आता है। सी का उपयोग करने के लिए अच्छे कारण हैं, लेकिन "यह अधिक काम है", या "लिनुस ने कहा तो" उनके बीच नहीं हैं।
जलफ

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

6
लिनुस सी ++ पर राय के लिए एक बुरा स्रोत है क्योंकि वह इसका उपयोग नहीं करता है और जहां तक ​​मुझे पता है, केवल 1990 में एक बार कोशिश की थी-कुछ।
ज़ैन लिंक्स

3
@Zan Linus ने कहीं और आत्म-नियंत्रण प्रदर्शित किया: "हम C ++ का उपयोग करना पसंद करेंगे और जो अतिरिक्त सुविधाएँ लाते हैं, लेकिन यह देखना कठिन है कि C ++ में C की तुलना में बुरा कोड कहां है"। मेरे जवाब पर उद्धरण "नेता का पालन करें" के बजाय एक राय का रिकॉर्ड है।
रिक टोक्यो

26

क्योंकि वे एक प्लगइन लिख रहे हैं और C ++ में कोई मानक ABI नहीं है।


9
हालांकि यह सच है, यह सी के लिए छड़ी करने का एक ठोस कारण नहीं है क्योंकि आप सी लिंकेज का उपयोग करके आवश्यक कार्यों को निर्यात कर सकते हैं और फिर भी सी + + में अपने कार्यान्वयन को बनाए रख सकते हैं।
कोडेलॉजिक

2
@ कोलोडेलिक - C ++ प्रोजेक्ट्स समान C प्रोजेक्ट्स की तुलना में कई अधिक प्रकार और फ़ंक्शन निर्यात करते हैं। अंतिम साझा लाइब्रेरी में इसे छिपाना संभव है, लेकिन इसके लायक होने की तुलना में यह संभवतः अधिक प्रयास है।
टॉम

tbh एक बहुत अच्छा जवाब नहीं है, लेकिन +1 क्योंकि C ++ में कोई मानक ABI नहीं है (हाँ .. C ++ बेकार है)
hasen

6
C का कोई मानक ABI नहीं है।
स्टीफन कैनन

25

लंबे संकलन का समय कष्टप्रद हो सकता है। C ++ के साथ आपके पास बहुत लंबा संकलन समय हो सकता है (जिसका अर्थ है, निश्चित रूप से, स्टैक ओवरफ्लो के लिए अधिक समय!)।


यह मतदान क्यों किया गया? मैं खुद सी ++ में बहुत काम करता हूं और मैं वापस सी में नहीं जाऊंगा, लेकिन यह वास्तव में दर्दनाक रूप से लंबे संकलन का समय हो सकता है (उदाहरण के लिए, टेम्पलेट्स के बारे में सोचें)।
फ्रैंक 18

6
मैं वास्तविक कार्य के लिए C ++ का उपयोग करता हूं, लेकिन मैं हमेशा निकट-संकलित संकलन समय के कारण C में प्रोटोटाइप करता हूं।
टॉम

हम्म, जब सही तरीके से, यानी फूला हुआ नहीं हो सकता है हम-की-की-ये-# शामिल हैं और निश्चित नहीं है, जो-सही-सही-शामिल-तो-मैं-शामिल-उन-उन सभी- # इसमें सम्‍मिलित समय साफ-सुथरा है। जब मैं एक या तीन फाइलों को हैक करता हूं, तो मुझे अपनी 100 KLOC परियोजनाओं को संकलित करने में सिर्फ 1-2 सेकंड लगते हैं।
सेबेस्टियन मच

4
@Tom: मुझे आश्चर्य है कि आपका वास्तविक कार्य C ++ कैसा दिखता है, यदि आप C. में प्रोटोटाइप कर सकते हैं तो क्या आप C ++ की क्षमताओं का उपयोग नहीं कर रहे हैं? क्या आप विस्तार से समझा सकते हैं?
सेबेस्टियन मच

24

मैं अपनी परियोजनाओं के लिए C ++ का उपयोग करता हूं। तब मुझे एक नौकरी मिली जहां सादे सी का उपयोग किया जाता है (खराब प्रलेखन के साथ एक एवी सॉफ़्टवेयर का 20 साल पुराना विकसित कोडबेस ...)।

सी में मुझे पसंद आने वाली 3 चीजें हैं:

  • कुछ भी निहित नहीं है: आप देखते हैं कि आपका कार्यक्रम वास्तव में क्या करता है या नहीं करता है। इससे डिबगिंग आसान हो जाती है।

  • नेमस्पेस और ओवरलोड की कमी एक फायदा हो सकता है: यदि आप जानना चाहते हैं कि किसी निश्चित फ़ंक्शन को कहाँ कहा जाता है, तो स्रोत कोड निर्देशिका के माध्यम से केवल संक्षिप्त करें और यह आपको बताएगा। किसी अन्य विशेष उपकरण की आवश्यकता नहीं है।

  • मैंने फ़ंक्शन पॉइंटर्स की शक्ति को फिर से खोजा। मूल रूप से वे आपको C ++ में सभी बहुरूपी सामान करने की अनुमति देते हैं, लेकिन वे और भी अधिक लचीले होते हैं।


8
+1 हालांकि C में इस तरह का बहुरूपता आमतौर पर शून्य * के माध्यम से प्राप्त किया जाता है, जो खतरनाक है क्योंकि यह संकलक की किसी भी क्षमता को जांचने में अक्षम करता है कि क्या आप कुछ बुरा कर रहे हैं।
जीडी 1

4
@ gd1 व्यवहार में मुझे एक भी मामला याद नहीं आ रहा है जब इससे void*परेशानी हुई हो। गलतियों से बचाने के लिए कई रक्षात्मक प्रोग्रामिंग तकनीकें हैं: हर जगह जोर डालना, मैजिक नंबर्स को अपने स्ट्रक्चर्स में जोड़ना (डिबग बिल्ड में), आदि। लेकिन आजकल हमारे पास वेलग्रिंड, डॉ। स्मृति, और यहां तक ​​कि MSVC उपकरणों को समस्याओं का पता लगाने के लिए कोड है, इसलिए स्मृति भ्रष्टाचार समस्याओं को सुलझाना बहुत आसान है।
कालमर्सि

4
मैं अपने कार्यक्रमों में स्मृति भ्रष्टाचार का लगभग अनुभव नहीं करता हूं, लेकिन यदि संभव हो तो मैं कार्यक्रम चलाने से पहले गलतियों का पता लगाना पसंद करूंगा। कास्टिंग void*के लिए whatever*कुछ संकलक अच्छा विश्वास में स्वीकार करता है। मैं अपने संकलक को पसंद करता हूं कि मुझ पर भरोसा न करें और मजबूत प्रकार की जांचों को लागू करने की संभावना है। C ++ कंपाइलर्स द्वारा जारी टेम्प्लेट प्रतिस्थापन की गलतियाँ पढ़ने के लिए दर्दनाक हैं लेकिन कम से कम कचरा संकलन नहीं करता है।
जीडी 1

1
@ gd1 अपनी पहली टिप्पणी पर, मुझे नहीं पता कि आपको प्रक्रियात्मक तकनीकों का कितना अनुभव है (मुझे लगता है कि आप ज्यादातर OO टैग में सक्रिय हैं)। void*आम तौर पर बचा जा सकता है। कस्टम व्यवहार जोड़ते समय विशिष्ट पैटर्न एक फ़ंक्शन पॉइंटर और void*उपयोगकर्ता डेटा के लिए गुजर रहा है । एक सामान्य इंटरफ़ेस आमतौर पर ऐसा दिखता है। फिर लाइब्रेरी जब void*इसके साथ आपके कॉलबैक में वापस जाती है तो उसके साथ कुछ और किए बिना। अक्सर आपके पास कोई अतिरिक्त डेटा नहीं होता है, इसलिए आप NULL को पास करते हैं, और अपने कॉलबैक में उपयोगकर्ता पैरामीटर को अनदेखा करते हैं। मैंने मान लिया कि आप यह जानते हैं।
कालमर्सि

@Calmarius "अक्सर आपके पास कोई अतिरिक्त डेटा नहीं होता है" -> यह वास्तव में बहुरूपता का लाभ है। शून्य बिंदुओं का उपयोग किए बिना, अतिरिक्त डेटा को बांधना आसान है। तो, आपका बहाना मूल रूप से "मैं वास्तव में उस सुविधा का उपयोग नहीं करता हूं।"
user2445507

15

मुझे आश्चर्य है कि किसी की उल्लिखित लाइब्रेरी नहीं है। बहुत सी भाषाएं C लिबास के खिलाफ लिंक कर सकती हैं और C फ़ंक्शंस (C ++ सहित बाहरी "C") को कॉल कर सकती हैं। C ++ बहुत ही एकमात्र ऐसी चीज़ है जो C ++ lib ('a lib के रूप में परिभाषित किया गया है जो C ++ में ऐसी विशेषताओं का उपयोग करता है जो C [जैसे ओवरलोड फ़ंक्शंस, वर्चुअल मेथड, ओवरलोडेड ऑपरेटर्स, ...] और निर्यात नहीं करता है। बाहरी सी "सी" 'के माध्यम से सी संगत इंटरफेस के माध्यम से सब कुछ।


1
ऐसा नहीं; आप "C" या __cdecl से अपने कार्यों को C पर उजागर कर सकते हैं
Crashworks

महान, लेकिन अन्य भाषाओं के साथ क्या काम करता है?
बिगसैंडविच

2
एक सी कामगार अधिक स्थानों पर काम कर सकता है।
बिगसैंडविच

1
सभी जो सी। से लिंक कर सकते हैं
क्रैश

2
इंटरऑपरेबिलिटी समस्याओं का सबसे स्पष्ट कारण नाम-प्रबंध है, और मुझे लगता है कि यह लाने लायक है।
टॉम

15

यदि आप चाहते हैं कि आपका कोड लगभग किसी भी प्रोग्रामर द्वारा सी में समझा जाए।


12

क्योंकि वे C99 में ऐसी विशेषताओं का उपयोग करना चाहते हैं जो C ++ में समतुल्य नहीं हैं।


हालाँकि, C ++ की उतनी सुविधाएँ नहीं हैं जो C ++ के लिए उपयोगी हैं जैसा कि लोग पहली नज़र में सोचते हैं। चर-लंबाई सरणियाँ? C ++ में std :: vectors है। जटिल / काल्पनिक संख्याओं के लिए समर्थन? C ++ में एक जटिल जटिल प्रकार है। टाइप-जेनेरिक गणित कार्य? C ++ ने मानक गणित कार्यों को ओवरलोड किया, जिससे समान परिणाम प्राप्त हुए।

नाम के शुरुआती? C ++ में नहीं, लेकिन वर्कअराउंड है:

struct My_class_params {
    int i;
    long j;
    std::string name;

    My_class_params& set_i(int ii)
    {
        i = ii;
        return *this;
    }

    My_class_params& set_j(long jj)
    {
        j = jj;
        return *this;
    }


    template <typename STRING>
    My_class_params& set_name(STRING&& n)
    {
        name = std::forward<STRING>(n);
        return *this;
    }

    My_class_params()
    {
        // set defaults
    }
};

class My_class {
    My_class_params params;
  public:
    My_class(const My_class_params& p) : params(p) { }
    ...
};

इससे आप चीजों को लिख सकते हैं जैसे:

My_class mc(My_class_params().set_i(5).set_name("Me"));

सुनो सुनो! C ++ में नामित नामित शुरुआती की कमी मुझे हर बार दीवार का उपयोग करती है जो मुझे इसका उपयोग करना है।
समयपूर्व

2
मैं इनिशियलाइज़र पर 100% के साथ हूँ !!!
जज मेगार्डन

यदि आप किसी फ़ंक्शन के बाहर एक वैश्विक संरचना को इनिशियलाइज़ करना चाहते हैं (ताकि आप .set _ * ()) नहीं कर सकते, तो C ++ आपको अनाम initilizer सिंटैक्स का उपयोग करने के लिए मजबूर करता है, या आपकी संरचना के लिए एक कंस्ट्रक्टर लिखने के लिए। मुझे उन विकल्पों में से कोई भी पसंद नहीं है।
युगांतरकारी

C99 (GCC) में वीएलए भी हैं जो इसके साथ काम करने में बहुत आसान हैं std:vector
वाहिद अमीरी

10

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

OTOH, अधिक जटिल परियोजनाओं के लिए, लालित्य अधिक अच्छा ठोस संरचनात्मक कठोरता प्रदान करता है जो स्वाभाविक रूप से मेरे कीबोर्ड से बाहर निकलेगा।


8

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

यदि आपका सिस्टम अपने दम पर रहता है, जैसा कि कई अनुप्रयोगों के साथ होता है, तो C ++ एक अच्छा विकल्प है।

यदि आपके सिस्टम को सी ++ (आमतौर पर कोडांतरक, या फोरट्रान लाइब्रेरी में अक्सर) में लिखे गए सॉफ़्टवेयर के साथ बातचीत करने की आवश्यकता है, तो आप एक तंग जगह पर हैं। उन प्रकार के मामलों के साथ बातचीत करने के लिए, आपको उन प्रतीकों के लिए नाम प्रबंधन अक्षम करना होगा। यह आमतौर पर उन वस्तुओं को घोषित करने के द्वारा किया जाता है extern "C", लेकिन फिर वे टेम्प्लेट, अतिभारित कार्य या वर्ग नहीं हो सकते। यदि वे आपके एप्लिकेशन एपीआई होने की संभावना रखते हैं, तो आपको उन्हें सहायक कार्यों के साथ लपेटना होगा, और उन कार्यों को वास्तविक कार्यान्वयन के साथ सिंक में रखना होगा।

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

संक्षेप में, अधिकांश लोगों के औचित्य के लिए इंटरऑपरेबल C ++ का ओवरहेड बहुत अधिक है।


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

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

8

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


8
अपने शिक्षकों की समझदारी!
आंद्रेई सिओबानु 13

6

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


6

ओह माय, सी बनाम सी ++, एक लौ युद्ध शुरू करने का एक शानदार तरीका। :)

मुझे लगता है कि C ड्राइवर और एम्बेडेड कोड के लिए बेहतर है।

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

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


इसका नाम C + या C100: _)
m3nda

4

मैं इस बात का अधिक प्रमाण नहीं पा सका हूँ कि आप C ++ पर C क्यों चुनना चाहते हैं।

आप शायद ही कह सकते हैं कि मैं क्या कहने वाला हूं सबूत; यह सिर्फ मेरी राय है।

C को लोग पसंद करते हैं क्योंकि यह prgrammer के दिमाग के अंदर अच्छी तरह से फिट बैठता है।

C ++ के कई जटिल नियम हैं [आपको वर्चुअल डिस्ट्रक्टर्स की आवश्यकता कब होती है, जब आप एक कंस्ट्रक्टर में वर्चुअल तरीके कह सकते हैं, ओवरलोडिंग और ओवरराइडिंग को कैसे इंटरैक्ट करते हैं, ...], और उन सभी में महारत हासिल करने के लिए बहुत मेहनत करनी पड़ती है। इसके अलावा, संदर्भों के बीच, ऑपरेटर ओवरलोडिंग और फ़ंक्शन ओवरलोडिंग, कोड के एक टुकड़े को समझने से आपको अन्य कोड को समझने की आवश्यकता हो सकती है जो ढूंढना आसान हो सकता है या नहीं।

संगठनों में एक अलग सवाल C ++ पर C को क्यों पसंद करेगा। मुझे नहीं पता कि, मैं सिर्फ एक लोग हूं ;-)

सी ++ की रक्षा में, यह तालिका में मूल्यवान विशेषताएं लाता है; एक जिसका मैं सबसे अधिक मूल्य रखता हूं, वह शायद पैरामीट्रिक ('ish) बहुरूपता है, हालांकि: संचालन और प्रकार जो तर्क के रूप में एक या एक से अधिक प्रकार लेते हैं।


2
++score: आपका कथन "सी जैसे लोग क्योंकि यह प्रोग्रामर के दिमाग के अंदर अच्छी तरह से फिट बैठता है" एक बहुत अच्छी तरह से कहा गया है। एक सरल भाषा में कार्यक्रम करने में सक्षम होने के नाते, जहां आप जानते हैं कि आप जो देखते हैं वह वही है जो आपको प्रोग्रामिंग भाषा के लिए वास्तव में आकर्षक संपत्ति है।
tchrist

3

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


क्या आप इनका उदाहरण दे सकते हैं?
एंड्रयू ग्रांट

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

1
सालों पहले लिनक्स कर्नेल को gcc या g ++ के साथ संकलित किया जा सकता था, लेकिन "अंत में, जबकि लाइनस विकास कर्नेल को बनाए रखता है ..." के तहत g ++ ने धीमी कोड ( tux.org/lkml/#s15-3 ) बनाया।
अधिकतम ल्य्बर्ट

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

2

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


1

क्योंकि आप एक ऐसी प्रणाली के लिए लिख रहे हैं जहाँ संसाधन तंग हैं (जैसे कि एक एम्बेडेड सिस्टम, या कर्नेल की तरह कुछ वास्तविक नंगे धातु कोड) और आप जितना संभव हो उतना कम ओवरहेड चाहते हैं।

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


3
वास्तव में भाषा के रूप में सी ++ की इतनी अधिक समस्या नहीं है, लेकिन पैथोलॉजिकल ब्लोट जो टेम्प्लेट के अंधाधुंध उपयोग का कारण बन सकता है।
क्रैश

1
ecos काफी हद तक C ++ में लिखा गया है। भाषा (C की तुलना में) और निष्पादन योग्य आकार (जब तक आप जानते हैं कि सुविधाओं का उपयोग करने के लिए) के बीच कोई संबंध नहीं है।
user52875

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

1
सभी बिंदुओं पर सहमत हुए। "क्या सुविधाओं का उपयोग करने के लिए" जानने का हमारा समाधान सिर्फ एक सी संकलक का उपयोग करना और इसे एक दिन कॉल करना था। निश्चित रूप से, हम C ++ काम कर सकते थे, (जो वास्तव में सुपर-नीद थोड़े तरीके से मजेदार होगा) लेकिन हमारे पास जहाज बनाने के लिए एक उत्पाद था, और इसके बारे में चिंता करने का समय नहीं था।
इलेक्ट्रॉन्स_अहॉय

1

C को जिस चीज की जरूरत थी, वह बेहतर प्रीप्रोसेसर थी। cfront एक था और इस तरह से पैदा हुआ c ++

मैं सी का उपयोग करता हूं, जहां 'सी ++ प्रीप्रोसेसर के रूप में' ठीक नहीं होगा।

मुझे पूरा यकीन है, किसी भी अच्छी तरह से लिखे गए सी ++ लाइब्रेरी / फ्रेमवर्क / टूलकिट के नीचे, आपको गंदे-पुराने-सी (या स्थिर जाति, जो समान है) मिलेंगे


0
  • कुछ साल पहले तक मौजूदा सी ++ कंपाइलर महत्वपूर्ण विशेषताओं को याद नहीं कर रहे थे, या समर्थन खराब था और समर्थित विशेषताएं उनके बीच बेतहाशा भिन्न होती हैं, और इसलिए पोर्टेबल एप्लिकेशन लिखना कठिन था।
  • प्रतीकों का कोई मानक नामकरण नहीं होने के कारण अन्य भाषाओं / अनुप्रयोगों के लिए सी ++ कक्षाओं को सीधे समर्थन देना मुश्किल है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.