C भाषा की तुलना में C ++ सीमाएँ क्या होंगी? [बन्द है]


116

C ++ के लाभ निम्नलिखित हैं

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

क्या कोई ठोस कारण और विशिष्ट परिदृश्य हैं, जहां किसी को C ++ से अधिक का उपयोग करना है?

इस सवाल का संदर्भ: सी में जेनरिक के लिए लाइब्रेरी

डुप्लिकेट नहीं, क्योंकि यह सवाल भाषा की सीमाओं के बारे में पूछ रहा है और इसके बारे में एक भाषा को दूसरे पर नहीं सीखना चाहिए।

पीटर किर्खम का पद मेरे लिए सबसे अधिक जानकारीपूर्ण था, विशेष रूप से C99 मुद्दों के संबंध में, जिन पर मैंने विचार नहीं किया था, इसलिए मैंने इसे स्वीकार कर लिया है। अन्य सभी को धन्यवाद जिन्होंने भाग लिया।


12
यह कोई फर्क नहीं पड़ता यह सवाल है कि क्या इरादा तार्किक होने के लिए है या नहीं, यह अभी भी है। किसी प्रोजेक्ट के लिए भाषा का चुनाव ठीक वैसा ही है: एक विकल्प।
बॉम्बे

7
@bombe क्या हम इस बात पर चर्चा करने वाले नहीं हैं कि सूचित विकल्प कैसे बनाए जाएं?



10
क्या यह विडंबना नहीं है जब आप C प्रोग्रामरों को C ++ में जाने की सलाह देते हैं कि वे आपके विचार के बारे में ग्रहणशील हैं, जैसा कि आप होंगे, यदि एक सी प्रोग्रामर ने आपसे कहा कि आप C ++ को खोद कर C को स्थानांतरित कर दें?
वारेन पी।

जवाबों:


136

इसका उत्तर मैंने एक वर्तमान प्रश्न के उत्तर में दिया है, जो C के लिए एक जेनेरिक लाइब्रेरी के बारे में पूछता है - प्रश्नकर्ता विशेष रूप से बताता है कि वे C ++ का उपयोग नहीं करना चाहते हैं।

C एक पूर्ण प्रोग्रामिंग भाषा है। C, C ++ का एक मनमाना उपसमुच्चय नहीं है। C, C ++ का सबसेट नहीं है।

यह मान्य सी है:

foo_t* foo = malloc ( sizeof(foo_t) );

इसे C ++ के रूप में संकलित करने के लिए आपको लिखना होगा:

foo_t* foo = static_cast<foo_t*>( malloc ( sizeof(foo_t) ) );

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


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

एक परियोजना मैं पर काम कर रहा हूँ में पहली सी फ़ाइल ले रहा है, तो ऐसा होता है अगर तुम सिर्फ अदला-बदली gcc std=c99के लिए g++:

sandiego:$ g++ -g  -O1 -pedantic -mfpmath=sse -DUSE_SSE2 -DUSE_XMM3  -I src/core -L /usr/lib -DARCH=elf64 -D_BSD_SOURCE -DPOSIX -D_ISOC99_SOURCE -D_POSIX_C_SOURCE=200112L -Wall -Wextra -Wwrite-strings -Wredundant-decls -Werror -Isrc  src/core/kin_object.c -c -o obj/kin_object.o | wc -l
In file included from src/core/kin_object.c:22:
src/core/kin_object.h:791:28: error: anonymous variadic macros were introduced in C99
In file included from src/core/kin_object.c:26:
src/core/kin_log.h:42:42: error: anonymous variadic macros were introduced in C99
src/core/kin_log.h:94:29: error: anonymous variadic macros were introduced in C99
...
cc1plus: warnings being treated as errors
src/core/kin_object.c:101: error: ISO C++ does not support the z printf length modifier
..
src/core/kin_object.c:160: error: invalid conversion from void*’ to kin_object_t*’
..
src/core/kin_object.c:227: error: unused parameter restrict
..
src/core/kin_object.c:271: error: ISO C++ does not support the z printf length modifier
src/core/kin_object.c:271: error: ISO C++ does not support the z printf length modifier

त्रुटियों की कुल 69 लाइनों में, जिनमें से चार अमान्य रूपांतरण हैं, लेकिन ज्यादातर उन विशेषताओं के लिए हैं जो C99 में मौजूद हैं लेकिन C ++ में नहीं।

ऐसा नहीं है कि मैं इसके लिए उन सुविधाओं का उपयोग कर रहा हूं। इसे एक अलग भाषा में पोर्ट करने के लिए महत्वपूर्ण काम होगा।

इसलिए यह सुझाव देना गलत है

[ए] सी कंपाइलर लगभग निश्चित रूप से वास्तव में एक सी ++ कंपाइलर है, इसलिए कोई सॉफ्टवेयर लागत निहितार्थ नहीं हैं

मौजूदा C कोड को C ++ के प्रक्रियात्मक सबसेट में पोर्ट करने में अक्सर महत्वपूर्ण लागत निहितार्थ होते हैं।

इसलिए 'C उद्देश्य का उपयोग करने के लिए C' में एक पुस्तकालय कार्यान्वयन की तलाश में प्रश्न के उत्तर के रूप में 'C ++ std :: queue class' का उपयोग करने का सुझाव देने के बाद 'JNI का उपयोग करके' java.util.Que क्लास को जावा java.util.Queure वर्ग कहने का सुझाव दिया गया है या 'कॉल द सीपीथॉन लाइब्रेरी' - ऑब्जेक्टिव C वास्तव में C (C99 सहित) का एक उचित सुपरसेट है, और Java और CPython लाइब्रेरी दोनों सी से सीधे कॉल करने योग्य हैं, बिना संबंधित कोड को C ++ भाषा में पोर्ट किए बिना।

बेशक आप C ++ लाइब्रेरी को C façade सप्लाई कर सकते हैं, लेकिन एक बार जब आप कर रहे हैं कि C ++ जावा या पायथन से अलग नहीं है।


21
हाँ। जब आप मॉलॉक का उपयोग करते हैं तो सी-स्टाइल कास्ट काफी सामान्य है। जब आप Malloc का उपयोग करते हैं तो यह c सबसेट के भीतर रहता है। यदि आप C ++ स्टाइल प्रोग्राम करना चाहते हैं, तो आप ऑपरेटर नए का उपयोग करेंगे, न कि static_cast + malloc का।
सुमा

33
यह कहना कि C, C ++ का सबसेट नहीं है, अविश्वसनीय रूप से पांडित्य है। निश्चित रूप से, आप कह सकते हैं कि "वर्ग" नामक सदस्य के साथ कोई भी संरचना संकलित नहीं होगी, लेकिन यह वास्तव में केवल मामूली संशोधनों की आवश्यकता है, और अधिकांश संकलक के पास कुछ सी-ओनली सुविधाओं को C ++ में जोड़ने के विकल्प हैं।
काज ड्रैगन

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

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

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

115

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

अगर मुझे चुनना है तो मैं अजगर और (या संभवतः C #) में इंटरफ़ेस और डेटाबेस इंटरैक्शन जैसे सभी उच्च स्तरीय सामान लिखूंगा और सी में तेजी से होने वाले सभी सामान। मेरे लिए जो मुझे सभी दुनिया का सर्वश्रेष्ठ देता है। C ++ में सब कुछ लिखना ऐसा लगता है जैसे सभी दुनिया में सबसे खराब हो रहा है।

संपादित करें: मैं यह जोड़ना चाहता हूं कि मुझे लगता है कि सी कुछ सी ++ सुविधाओं के साथ सी काफी हद तक एक बुरा विचार है यदि आप एक परियोजना पर काम करने वाले कई लोग होने जा रहे हैं या यदि रखरखाव प्राथमिकता है। इस बात पर असहमति होगी कि एक 'कुछ' का गठन क्या होता है और सी में कौन सा बिट किया जाना चाहिए और सी ++ में कौन से बिट्स अंततः एक बहुत ही स्किज़ोफ्रेनिक कोडबेस के लिए अग्रणी होते हैं।


24
मैंने कई वर्षों तक C ++ का उपयोग किया और अभी भी अपना 50% समय रिफैक्टिंग कोड "C ++ सही" होने के लिए बिताया। यह एक बुरा सपना है, जैसा कि आप कहते हैं।
काई

12
आप हमेशा सिर्फ पहली बार ही कर सकते थे। कास्ट जोड़ना मुश्किल नहीं है।
GManNickG

14
मैंने दस वर्षों के लिए सी ++ का उपयोग किया, और सी (मेरे मामले में एम्बेडेड सिस्टम के लिए) पर वापस जाना सबसे अच्छी बात थी जो मैंने कभी किया था।
वॉरेन पी।

मुझे यह जवाब पसंद है। आपने मेरी भावनाओं को भी भुनाया है। मेरे पास सी ++ देव के रूप में वर्षों का काम है, मेरा दिन का काम अभी भी सी ++ है। लेकिन इसका मतलब यह नहीं है कि मुझे भाषा पसंद है, मैं सी
मैट जॉइनर

10
+1, इसके कारण मुझे पता चलता है कि जब भी मैं C ++ लिखता हूं तो मैं अपना अधिक समय डिबगिंग में खर्च करता हूं और जब भी मैं C कोड करता हूं, तो कठिन सतहों के मुकाबले अपना सिर पीट लेता हूं । आप से अधिक सहमत नहीं हो सकते। सबसे अच्छा जवाब। :)
अपरेंटिसहैकर

58

सी ++ बस कुछ वास्तविक दुनिया के वातावरण में समर्थित नहीं है, जैसे निम्न-स्तरीय एम्बेडेड सिस्टम। और इसके लिए एक अच्छा कारण है: सी ऐसी चीजों के लिए आसानी से पर्याप्त है, इसलिए कुछ बड़ा उपयोग क्यों करें?


2
सही। मैंने 8 बिट माइक्रो कंट्रोलर के लिए सी कंपाइलर देखे हैं।
dmckee --- पूर्व-मध्यस्थ ने बिल्ली का बच्चा

6
बेशक। सबसे अधिक नहीं अगर सभी 8-बिट चिप्स में इन दिनों सी कंपाइलर हैं।
एली बेंडरस्की

gbdk.sourceforge.net - GBDK एक के लिए ..
Kelden Cowan

+1 यह सही उत्तर है। C ++ कंपाइलर C कंपाइलर्स की तुलना में लिखना अधिक कठिन होता है, मोटे तौर पर (मल्टीपल) इनहेरिटेंस की जटिलताओं के कारण।
ब्लूराजा - डैनी पफ्लुगुएफ्ट

9
@BlueRaja: टेम्प्लेट की तुलना में ... कई-वंशानुक्रम यहां वास्तविक निवारक नहीं हो सकते हैं। सभी टेम्प्लेट के बाद उनकी अपनी एक पूरी तरह से विकसित भाषा है।
Matthieu एम।

49

मुझे C ++ में प्रोग्रामिंग से नफरत है।


6
Lol मुझे वह पसंद है
तमस Czinege

30
बहुत समझाने वाला! मैं आपके तर्क के आधार पर अजगर पर स्विच करने के बारे में सोच रहा हूं।
जिमी जे

8
शायद यकीन नहीं हो रहा है, लेकिन इसकी असली वजह है।
जॉर्ज शॉली

@ जिमी जे: अजगर अविश्वसनीय है। यह यूनिक्स, सी और आपके सभी "आधुनिक" भाषा सुविधाओं में से सबसे अच्छा है। यदि आपके पास प्रदर्शन समस्याएं हैं, तो पायथन चाहता है कि आप सी में छोड़ दें, और यह आसानी से करता है।
मैट जॉइनर

2
@Georg: मैं मानता हूँ कि मैंने कभी नहीं देखा, मैं अजगर से प्रभावित हूँ।
मैट जॉइनर

38

कारणों में से कुछ हो सकता है:

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

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


4
मुझे लगता है कि C कोड C ++ की तुलना में बहुत तेजी से संकलित होता है। हमारी कंपनी में एक बड़ी परियोजना (एक मिलियन से अधिक लाइनें) 30 सेकंड से कम समय में संकलित होती हैं।
कालमर्सियस

31

एम्बेडेड प्रोग्रामिंग, प्रदर्शन और सामान के बारे में तर्कों का भार है, मैं उन्हें नहीं खरीदता। C ++ उन क्षेत्रों में C की तुलना आसानी से करता है। तथापि:

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

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

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


8
कोई अपराध नहीं है, लेकिन यह भी निर्भर करता है कि आप क्या सोचते हैं C ++ है। वंशानुक्रम कुछ ऐसा है जिसे मैं जावा के साथ C ++ से अधिक संबद्ध करता हूं, और यदि आप C ++ को OOP भाषा á la जावा (C कक्षाओं के साथ) के रूप में सख्ती से मानते हैं, तो मैं आपसे सहमत हूं। यदि आप C ++ के अधिक आधुनिक स्वाद के साथ चिपके रहते हैं, तो मुझे लगता है कि यह C से अधिक मजेदार है
jalf

11
हालांकि एक बार फिर, मैं सी ++ को एक ओओ भाषा के रूप में नहीं समझता हूं, और इसे एक के रूप में नहीं माना जाना चाहिए। मुझे लगता है कि सामान्य प्रोग्रामिंग C ++ का अधिक मजबूत गुण है। अधिकांश C ++ कोड जो मैं देख रहा हूं वह "OO" होने के लिए विशेष रूप से कठिन प्रयास नहीं करता है, या इसमें अनावश्यक कोड नहीं है। यह अक्सर बराबर सी कोड की तुलना में अधिक दुबला होता है
jalf

3
@ जैलफ: एक और चीज़ जो मुझे लगती है वह है "C- ++ में हमेशा-एक-हमेशा-एक-बेहतर-बेहतर" व्याकुलता बन सकती है, जो टेम्प्लेट के साथ चीजों को सामान्य कर रही है। "शायद हमें इस वर्ग के उपयोगकर्ता को यह तय करने देना चाहिए कि अंतर्निहित पूर्णांक प्रकार क्या उपयोग करना है?" लेकिन आपको शायद इसकी आवश्यकता नहीं है, और सी में आप परेशान नहीं होंगे। और कभी-कभी मैं खुद को सोचता हुआ पाता हूं, "हमें वास्तव में इस वर्ग को एक फॉरवर्ड इटेरियर इंटरफ़ेस प्रदान करना चाहिए," जब सी में आप सिर्फ एक पॉइंटर को पहले तत्व और एक गिनती, या (fanciness की ऊंचाई!) को एक फंक्शन में ले जाएंगे। कॉलबैक फ़ंक्शन पॉइंटर।
j_random_hacker

2
मुझे लगता है जब C ++ में कोडिंग में मदद मिलती है तो मैं एक कदम पीछे ले जाता हूं। लक्ष्य तय करें, और उसकी ओर (सी शैली) लिखें। सी ++ आइएमएस में कारक के रूप में उनकी उपयोगिता स्पष्ट हो जाती है।
मैट जॉइनर

2
infinite gunfire, ओह, हाँ, तो सच है। हमारे पैर सचमुच कांपते हैं :)
quetzalcoatl

27

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

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

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

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

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

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

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

जिंदगी छोटी है...


2
+1, अधिक सहमत नहीं हो सका।
लापताफैक्टर

2
यह उल्लेखनीय रूप से लिनुस के तर्क के समानांतर लगता है। (एक वस्तु संदर्भ से कम = समझने में आसान।)
वॉरेन पी।

20

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

विरासत में प्राप्त होने और बनाए रखने में अनुभव से बोलते हुए: C में एक भयानक डिजाइन को समझना, खोलना, और कुछ को समझने योग्य बनाने में मुश्किल है।

C ++ में एक भयानक डिजाइन असीम रूप से बदतर है क्योंकि अमूर्त की यादृच्छिक परतें आपके मस्तिष्क को कोडबेस के चारों ओर देखभाल करते हुए यह पता लगाने की कोशिश करती हैं कि किस परिस्थिति में किस कोड को निष्पादित किया जा रहा है।

अगर मुझे उन इंजीनियरों के साथ काम करना है जो मुझे पता है कि महान डिजाइन का उत्पादन नहीं करेंगे, तो मेरे पास पहले की तुलना में बहुत अधिक है।


आमीन, भाई। हार्डवेयर इंजीनियरों द्वारा निर्मित सी स्रोत के साथ काम करने के बाद मुझे लगता है कि अगर मैं इसे सी ++ में कर चुका होता हूं, तो मैं क्या सोचूंगा।
रिचर्ड चैंबर्स

19

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

  • सामान्य कार्यों की तुलना में कक्षाओं और सदस्य कार्यों में शून्य ओवरहेड होता है (जब तक कि आप आभासी कार्यों का उपयोग नहीं करते हैं, उस स्थिति में जब फ़ंक्शन का उपयोग करने वाले की तुलना में कोई ओवरहेड नहीं होता है)
  • टेम्प्लेट बहुत कम ओवरहेड होते हैं (सबसे अधिक अक्सर ओवरहेड नहीं)

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


3
वर्चुअल फ़ंक्शंस के साथ एक क्लास में अधिक ओवरहेड होता है: प्रत्येक उदाहरण को प्रकार की पहचान करने के लिए एक अतिरिक्त फ़ील्ड पर ले जाना पड़ता है।
12st पर bstpierre

6
क्या अधिक से अधिक उपरि? प्रकार को vtbl में किया जाता है। यदि आप फ़ंक्शन पॉइंटर्स का उपयोग करके समान तंत्र को लागू करते हैं, तो आपको उस फ़ंक्शन पॉइंटर का चयन करने के लिए कम से कम एक पॉइंटर (या इंडेक्स, या जो कुछ भी) की आवश्यकता होती है।
सुमा

3
bstpierre: मुझे लगता है कि सुमा जो कह रही है, वह यह है कि सी में खुद को मैन्युअल रूप से लागू करने की तुलना में इसके पास कोई अधिक उपरिव्यय नहीं है
मार्टिन यॉर्क

2
कक्षा के एक उदाहरण के लिए एक सूचक वर्ग के प्रत्येक उदाहरण में संग्रहीत किया जाता है।
टेंशनर

5
एक ओवरहेड है, लेकिन मेरा क्या मतलब है कि यदि आप किसी भी प्रकार का डायनेमिक रिज़ॉल्यूशन चाहते हैं, तो आपको सी को पहचानने के लिए कुछ स्टोरेज की आवश्यकता है, यहां तक ​​कि अगर आप डायनेमिक प्रकार नहीं चाहते हैं, तो आपको ओवरहेड भुगतान करने की आवश्यकता नहीं है ( आभासी कार्यों का उपयोग न करें यदि आपको उनकी आवश्यकता नहीं है)।
सुमा

13

अंग्रेजी में बोलने की सीमा क्यों? शायद आप सर्बियाई में एक अधिक रचनात्मक लेखक होंगे।

स्पष्ट पतन के साथ भी यही तर्क है। यदि आपके पास कोई कार्य है, और आपके आरामदायक उपकरण कार्य को कुशलता से हल करते हैं, तो आप अच्छे कारणों के लिए अपने आरामदायक उपकरणों का उपयोग करेंगे।


3
अगर मैं धाराप्रवाह अंग्रेजी और धाराप्रवाह दोनों सर्बियाई बोलता हूं, तो मुझे यकीन है कि मैं अधिक रचनात्मक होगा। क्या आप असहमत हैं?

2
@ नील वास्तव में, लेकिन सर्बियाई सीखने के लिए आवश्यक प्रयास को मेरी वर्तमान रचनात्मकता ब्लॉक को हल करने के लिए उचित नहीं ठहराया जा सकता है।
स्लिम

2
मुझे लगता है कि अर्नो इस तथ्य को उजागर कर रहा है कि आप सीपीयू के लिए नहीं लिख रहे हैं, आप अपने सहकर्मियों को पढ़ने के लिए लिख रहे हैं, और आपके अन्य पुस्तकालयों को लिंक करने के लिए, और इसी तरह। आखिरकार, अगर मैं सिर्फ अभिव्यक्ति और गति के लिए जा रहा था, तो मैं OCaml में लिखूंगा।
केन

10

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

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


1
एर्म ... नहीं? आप C बेस सीखते हैं (संभवतः सरणियों और C- शैली स्ट्रिंग हैंडलिंग के अपवाद के साथ <वेक्टर> और <string>) के पक्ष में गिरा दिया जाता है, और आप जा रहे हैं। आप सब कुछ उठा सकते हैं जैसे आप साथ जाते हैं। आपको
O

4
C "छोटा" हो सकता है लेकिन लंबे समय में इसका उपयोग करना आसान नहीं है। मैनुअल मेमोरी प्रबंधन? जी नहीं, धन्यवाद।
जिमी जे

7
C ++ में स्वचालित मेमोरी प्रबंधन जैसी कोई चीज नहीं है।
वॉरेन पी

3
C ++ मेमोरी प्रबंधन समस्या को हल नहीं करता है। बस जब आपको लगा कि आपके पास पॉइंटर्स पर एक हैंडल है, C ++ जाता है और एक भयानक अपवाद मॉडल जोड़ता है। डेटा संरचनाओं को छोड़कर, C99 भूमि पर आइए, मुझे पूरा यकीन है कि मैं मुश्किल से मॉलोक को छू पाऊंगा। फिर भी मैं एक मुट्ठी भर मल्कोक कॉल "इनकैप्सुलेट" कर सकता हूं। यह C ++ (अंतर्निहित मेमोरी प्रबंधन, केवल इसके ढेर के बजाय ढेर पर किया गया) में एक ही कहानी है, केवल सभी स्मार्ट पॉइंटर जैज के साथ।
मैट जॉइनर

1
@ereOn: यह सच है, टिप्पणी के रूप में मैं इसे 3 साल पहले लिखा था अब नहीं रखती है। :)
मैट जॉइनर

10

मैं डैन ओल्सन के जवाब पर अनुवर्ती कार्रवाई करना चाहता हूं। मेरा मानना ​​है कि लोग सी ++ के संभावित खतरनाक और काउंटर-उत्पादक सुविधाओं से डरते हैं, और उचित रूप से ऐसा करते हैं। लेकिन डैन जो कहता है, उसके विपरीत, मुझे नहीं लगता कि बस एक कोडिंग मानक तय करना दो कारणों से प्रभावी है:

  1. कोडिंग मानकों को सख्ती से लागू करना मुश्किल हो सकता है
  2. एक अच्छे के साथ आना बहुत मुश्किल हो सकता है।

मुझे लगता है कि यहां दूसरा कारण पहले की तुलना में बहुत अधिक महत्वपूर्ण है, क्योंकि एक कोडिंग मानक पर निर्णय लेना आसानी से एक राजनीतिक मामला बन सकता है और बाद में संशोधन के अधीन हो सकता है। निम्नलिखित सरलीकृत मामले पर विचार करें:

  1. आपको stl कंटेनरों का उपयोग करने की अनुमति है, लेकिन अपने स्वयं के कोड में किसी भी टेम्पलेट का उपयोग करने के लिए नहीं।
  2. लोग शिकायत करना शुरू करते हैं कि वे अधिक उत्पादक होंगे यदि उन्हें सिर्फ इस या उस टेम्पलेट वर्ग को कोड करने की अनुमति दी गई थी।
  3. इसकी अनुमति देने के लिए कोडिंग मानक को संशोधित किया गया है।
  4. एक अत्यधिक जटिल कोडिंग मानक के लिए एक ढलान को स्लाइड करें जो कोई भी उस तरह के खतरनाक कोड का पालन और उपयोग नहीं करता है जो मानक को रोकने के लिए किया गया था, मानक के आसपास अतिरिक्त नौकरशाही के साथ संयुक्त।

(चरण 3 में मानक को संशोधित नहीं किया गया विकल्प वैकल्पिक रूप से विचार करने के लिए बहुत ही अनुचित है और वैसे भी उतना बेहतर नहीं होगा।)

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


10

जब मैं पुस्तकालय कोड लिखता हूं तो मैं C का उपयोग करता हूं, या कम से कम एक C इंटरफ़ेस निर्यात करता हूं।

मैं गैर-परिभाषित एबीआई बाधाओं को नहीं चाहता।


वही। केवल इंटरफेस में सी सख्त। आखिरी चीज जो मैं चाहता हूं, वह है किसी और का हास्यास्पद वस्तु ढांचा, जिस पर मुझे धकेल दिया गया।
मैट जॉइनर

9

मैंने कभी भी C ++ को C का उपयोग करने के लिए कोई तर्क नहीं देखा है जो मैं आश्वस्त करता हूं। मुझे लगता है कि ज्यादातर लोग कुछ सुविधाओं से डरते हैं C ++ ऑफ़र, अक्सर उचित रूप से। फिर भी यह मुझे आश्वस्त नहीं करता है क्योंकि कोई कोडिंग मानकों के माध्यम से कुछ विशेषताओं का उपयोग करने या न करने के लिए लागू कर सकता है। C में भी, बहुत कुछ है जिससे आप बचना चाहते हैं। सी ++ को पूरी तरह से छोड़ना अनिवार्य रूप से कह रहा है कि यह सी पर कोई ठोस लाभ प्रदान नहीं करता है जो एक बेहतर कोड लिखने में मदद करेगा, जो कि एक ऐसा विचार है जिसे मैं काफी अज्ञानी मानता हूं।

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


3
सहमत, "C, C ++ से बेहतर है" शेख़ी कभी जांच के लिए खड़े नहीं होते हैं।
जिमी जे

6
मेरा मानना ​​है कि C ++ मुझे बहुत लाभ पहुंचाता है, और COSTS ME को भारी मात्रा में आकस्मिक जटिलता है। मेरा मानना ​​है कि यह C ++ पाठ्यपुस्तकों के लगभग 1500 पृष्ठों और दस वर्षों के प्रयासों को C ++ में उतना ही कुशल बनाने के लिए होगा जितना मैं वर्तमान में C, पास्कल, पायथन और ऑब्जेक्टिव-सी में हूं। उपरोक्त भाषाओं में से प्रत्येक लगभग 20x अधिक ऑर्थोगोनल, कॉम्पैक्ट और मानसिक रूप से उपयोग करने के लिए सुविधाजनक है, अधिक शक्तिशाली उल्लेख करने के लिए नहीं, उन वातावरण में जहां मैं उनका उपयोग करता हूं। मेरे सामान्य विकास के वातावरण में C ++ के लिए बस तर्कसंगत रूप से औचित्यपूर्ण उपयोग नहीं हैं।
वॉरेन पी।

@Warren आप केवल किसी भी भाषा की तरह, आप जो भी उपयोग करते हैं उसके लिए भुगतान करते हैं। यदि आप यह तय करने में सक्षम नहीं हैं कि C ++ में समझदारी से कैसे कोड किया जाए तो यह आप पर है, भाषा पर नहीं।
दान ओल्सन

2
ऐसा नहीं। यदि आप किसी परियोजना के एकमात्र डेवलपर हैं, तो ऐसा हो सकता है। लेकिन जैसे ही हमारे पास दो डेवलपर होते हैं, हमारे बीच लड़ाई होती है। क्या? आप आईओसी कंटेनरों पर जोर देते हैं, जबकि मैं प्रतिनिधियों को करने का कुछ और तरीका पसंद करता हूं ... आपको तीन स्तर के नेस्टेड टेम्पलेट पसंद हैं, और मैं शून्य टेम्पलेट्स को पसंद करता हूं। गड़बड़।
वॉरेन पी

मुझे पता है कि यह पोस्ट 10 साल पुरानी है लेकिन क्या अब C और C ++ की तुलना करना भी उचित है? वे दोनों अलग-अलग हैं, भाषाओं को अलग किया गया है (C99 के बाद से) और वे दोनों उनके लाभ और कमियां हैं जिन्हें हर एक कवर करता है। सी ++ डिबग करना और बनाए रखना मुश्किल है? सी के खोजकर्ता चलो आप बेहतर डिबग करते हैं। सी में जेनरिक नहीं है? C ++ में जेनरिक है! इस समय, कोई भी भाषा दूसरे से बेहतर नहीं है।
नर्गल 23

9

एक बिंदु जो मैंने अभी तक नहीं उठाया है, जो मुझे लगता है कि सबसे महत्वपूर्ण है:

मैं रोजाना जितने लाइब्रेरियों का इस्तेमाल करता हूं, उनमें से ज्यादातर लाइब्रेरियन हैं, जो पाइथन, रूबी, पर्ल, जावा, आदि के लिए बाइंडिंग हैं। मैंने जो देखा है, उसमें से 19 अलग-अलग लैंग्वेज बाइंडिंग के साथ C लाइब्रेरीज़ को लपेटना काफी आसान है। C ++ लाइब्रेरीज़ लपेटें।

उदाहरण के लिए, मैंने काहिरा को एक बार सीखा , और तब से इसे 3 या 4 अलग-अलग भाषाओं में इस्तेमाल किया है। बड़ी जीत! मैं इसके बजाय एक ऐसा कार्यक्रम लिखूंगा जिसे भविष्य में फिर से इस्तेमाल किया जा सकता है, और एक को लिखना जिसे आसानी से अन्य प्रोग्रामिंग भाषाओं में अपनाया जा सकता है, यह एक चरम मामला है।

मुझे पता है कि C ++ पुस्तकालयों को बांधना संभव है, लेकिन AFAICT यह समान नहीं है। मैंने अन्य भाषाओं में Qt (v3 और v4) का उपयोग किया है और इसका उपयोग करने के लिए कहीं भी अच्छा नहीं है: उन्हें ऐसा लगता है जैसे C ++ किसी अन्य भाषा में लिख रहा है, देशी पुस्तकालयों की तरह नहीं। (आपको तार के रूप में C ++ विधि sigs पास करना होगा!)

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


"पास के तरीके स्ट्रिंग के रूप में!" बात Qt का दोष है, C ++ का नहीं। आप वास्तव में एक सी रूपरेखा के साथ एक ही बेवकूफ तंत्र हो सकते हैं जिसे आप करना चाहते हैं। यहां तक ​​कि क्यूटी के लोग इस बात से सहमत हैं कि ऐसा करना एक गलती थी। उस समय उनके दिमाग में कोई बेहतर विकल्प नहीं था और जब उन्हें एहसास हुआ तो इसे वापस लाने में बहुत देर हो गई।
ेरेऑन

7

Windows कर्नेल विकास c ++ (दुख की बात) का समर्थन नहीं करता है।


यह कैसा है? क्यों? क्या बाइनरी C ++ कंपाइलर से C कंपाइलर से अलग है? क्या ड्राइवर का विकास केवल एपीआई के पालन का नहीं है?
डेव वान डे आईंड

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

3
मैं जोड़ूंगा कि लिनक्स Torvalds सौभाग्य से अपवादों की तुलना में अधिक कारण के लिए लिनक्स में C ++ के किसी भी अवसर को टॉर्चर करता है। अन्य भाषाओं में कुछ ओएस रहे हैं: जावा, सी ++, कोडांतरक। केवल असेंबलर ही उचित उपयोग के साथ बच गए हैं।
मैट जॉइनर


यह दृश्य स्टूडियो 2015 के लिए नोटिस है?
लेजेंड लय

6

आप एक मनोरंजक शेख़ी के बारे में पढ़ सकते हैं कि लिनुस टॉर्वाल्ड्स यहां सी के पक्षधर क्यों हैं


6
यह C ++ के खिलाफ शेख़ी की तुलना में ऑब्जेक्ट-ओरिएंटेड डिज़ाइन के खिलाफ आधे-सुसंगत शेख़ी से अधिक है।
डैन ओल्सन

16
श्री टॉर्वाल्ड्स के पास उन चीजों की एक लंबी सूची है जो उन्हें पसंद नहीं हैं, सी ++, एमएसीएस, तोड़फोड़, कुछ का उल्लेख करने के लिए ओओ। कभी-कभी इच्छा होती है कि वह अपने होंठ को थोड़ा और दबाए

11
लिनुस को शेख़ी पसंद है और लोगों को भड़काने और परेशान करने की कोशिश करता है। दुर्भाग्य से, उन्होंने यह घोषित करने से पहले C ++ सीखने की जहमत नहीं उठाई कि यह बेकार है। दुर्भाग्य से, उनके पंथ निम्नलिखित मानते हैं कि वे जो कुछ भी कहते हैं वह सच होना चाहिए।
जल्फ

9
शिक्षा की तुलना में मनोरंजन के लिए लिंक अधिक था
पॉल डिक्सन

6
सबूत है कि यहां तक ​​कि जीनियस कभी-कभी डोलट्स हो सकते हैं।
काज ड्रैगन

5

मैक पर मूल कोड ऑब्जेक्टिव-सी है। एक पीसी पर मूल कोड c (window.h) या c ++ (mfc) है। ये दोनों वातावरण आपको कम या कोई बदलाव नहीं करने देंगे। जब मैं चाहता हूं कि कोड का एक पुस्तकालय क्रॉस प्लेटफॉर्म हो तो एआई सी एक अच्छा विकल्प लगता है।


4

मैं कई कारणों के बारे में सोच सकता हूं।

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

प्रश्नकर्ता, या वे लोग जिनके साथ काम करते हैं, वे C से परिचित हो सकते हैं, लेकिन C ++ से नहीं।

यह परियोजना सी में हो सकती है। जबकि सी में कुछ सी ++ सुविधाओं को जोड़ना संभव है, जिससे आसानी से एक अप्राप्य गड़बड़ हो सकती है। मैं एक भाषा या दूसरी (आमतौर पर C ++, जब व्यावहारिक हो) लेने का सुझाव दूंगा।

प्रश्नकर्ता के पास C ++ के सीखने की अवस्था का अप्रचलित दृश्य हो सकता है। (जब सही तरीके से संपर्क किया गया, तो यह सी की तुलना में आसान है। अधिकांश परिचयात्मक पुस्तकों को मैंने देखा है कि यह सही तरीके से नहीं है।)

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


3

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


3

मैं C ++ का उपयोग C प्रोग्रामिंग के लिए दो कारणों से करता हूं:

  • vectorऔर stringसरणी मेमोरी प्रबंधन को मुझसे दूर करने के लिए
  • सख्त प्रकार की जाँच और चेतावनी देने और / या उपद्रव को पकड़ने के लिए मैं अन्यथा चूक जाएगा।

तो यह वास्तव में कुछ सी ++ उधार ले रहा है, लेकिन सी ++ कंपाइलर का उपयोग जितना मैं कर सकता हूं। जैसा कि उत्तर में कोई और कहता है, मुझे लगता है कि मैं वास्तव में इस तरह से और अधिक सी ++ उठा रहा हूं और जहां सी बहुत अधिक शामिल होगा, मैं 10 ++ का उपयोग करता हूं। RAII का उपयोग करते हुए मॉनिटर / लॉक, इनमें से एक है जिसका उपयोग मैंने हाल ही में बहु-थ्रेडेड प्रोग्रामों के साथ काम करते हुए किया है और फाइलों को खोलने / बंद करने के लिए इसी तरह का एक और निर्माण किया है।


3

मुझे लगता है कि C अधिक पोर्टेबल है। मैंने लगभग 5 साल पहले यूनिक्स (AIX, Irix, HPUX, Linux) के कई स्वादों के लिए कोड पोर्ट किया। सी कोड को पोर्ट करना आसान था, लेकिन हमारे पास सी ++ कोड में से कुछ को पोर्ट करने में विभिन्न समस्याएं थीं। शायद यह सिर्फ अपरिपक्व विकास वातावरण था, लेकिन मैं इस वजह से C ++ पर C का अधिक उपयोग करूंगा ...


1
पंद्रह साल पहले मैं HP ++, AIX और Solaris को लक्षित करने वाली C ++ परियोजना के लिए मुख्य डेवलपर था। हमारे पास बहुत कम सी ++ पोर्टेबिलिटी समस्याएं थीं - हमारे द्वारा किए गए लगभग सभी सी सिस्टम कॉल असंगति के साथ थे।

1
दस साल से भी कम समय पहले, मैं पारंपरिक संकलक का उपयोग करते हुए HPUX, सोलारिस और Tru64 का उपयोग कर रहा था। हमारी रातें कभी नहीं बनीं। जब हमने AIX जोड़ा, तो हमने मानक C ++ पर स्विच करने का निर्णय लिया।
डेविड थोरले

हो सकता है कि जिन लोगों ने आपका कोड लिखा था वे बकवास से बेहतर कोडर थे जिनसे मुझे निपटना पड़ा :-)
गॉर्डन थॉम्पसन

3
  1. C एक सरल भाषा है, C ++ नहीं है। कई लोगों के लिए, C ++ बस पूरी तरह से मास्टर करने के लिए बहुत जटिल है, http://en.wikipedia.org/wiki/C%2B%2B#Criticism देखें ।

  2. जटिलता की वजह से, अलग-अलग प्रोग्रामर आमतौर पर भाषा के विभिन्न सबसेट को मास्टर करते हैं। यह अन्य लोगों के कोड को दर्दनाक बनाता है।

  3. भाषा की जटिलता, नुकसान बहुत अधिक विकर्षण जोड़ते हैं, और कभी-कभी उत्पादकता को नुकसान पहुंचाते हैं। नौकरी पर ध्यान केंद्रित करने के बजाय, मैंने अक्सर खुद को भाषा के साथ संघर्ष करते पाया। जावा / अजगर अधिक उत्पादक विकल्प हैं।

  4. एक टूटे हुए सी कोड को डीबग करना आमतौर पर एक टूटे हुए सी ++ कोड को डीबग करने की तुलना में बहुत अधिक सीधा है।

  5. जावा / सी # के विपरीत, सी ++ मानक पुस्तकालय सी मानक पुस्तकालय के दायरे से बहुत कम हासिल करता है।

  6. कुछ प्रसिद्ध प्रोग्रामर जैसे लिनुस टॉर्वाल्ड्स (लिनक्स) और रिचर्ड स्टेलमैन (एमएसीएस) C ++ को नापसंद करते हैं।


3
जब तक मैं तर्क # 6 नहीं पढ़ता, मैंने आपके जवाब को वोट देना उचित समझा।
फ़ूज

1

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


1
हम्म, कारण जो मैंने C से C ++ में स्विच किया था (बहुत समय पहले) सख्त प्रकार की जाँच के लिए था। मुझे पसंद है कि कंपाइलर मेरी गलतियों को ढूंढने के बजाय उपयोगकर्ता को एक कोर डंप का अनुभव कराए।

1

मेरे विचार से तीन कारण हैं। एक यह है कि सी अपने बायनेरिज़ के छोटे आकार और किसी भी सिस्टम पर सी कंपाइलरों की व्यापक उपलब्धता के कारण एम्बेडेड सिस्टम के लिए अधिक अनुकूल है। दूसरा पोर्टेबिलिटी है: C एक छोटी भाषा है, और ANSI C कोड कहीं भी संकलित होगा। C ++ में पोर्टेबिलिटी को तोड़ना आसान है। आखिरी तो भाषा ही है। C ++ कठिन है, और निश्चित रूप से बहुत खराब तरीके से डिजाइन की गई भाषा है। टॉर्वाल्ड्स की पकड़ ऊपर बताई गई है। आप C ++ अक्सर पूछे जाने वाले प्रश्नों ( http://yosefk.com/c++fqa/ ) को भी देखना चाह सकते हैं ।


5
और, अगर आप बुद्धिमान हैं, तो FQA को देखने के बाद आपको एहसास होगा कि यह किसी ऐसे व्यक्ति द्वारा हैक की गई नौकरी है जो वास्तव में C ++ को नहीं समझता है, लेकिन वैसे भी इससे नफरत करता है।
डेविड थॉर्नले

1

पोर्टेबिलिटी एक मुद्दा हो सकता है। गॉर्डन कारपेंटर-थॉम्प के जवाब में भिन्न, मैं सुझाव दूंगा कि यह विभिन्न लिनक्स या यूनिक्स संस्करणों पर libstdc ++ के विभिन्न संस्करणों का रनटाइम समर्थन है। इस बारे में अच्छी चर्चा के लिए इस लिंक को देखें । थोड़ा अंश:

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

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


1

मैं यहां दोनों दिशाओं में कई सुझावों का पालन कर सकता हूं। लेकिन अंत में यह नीचे आता है) तुलनीय सरल बी) तुलनीय जटिल।

मुझे इस बात का अंदाजा नहीं है कि अगर किसी ने "जटिलता" एक तरह की भाषा जटिलता मापी है।

0 - 10 के पैमाने पर मैं शायद C को 2 या 3 पर रेट करूंगा जबकि C ++ 8-10 के बीच होगा। मैं तर्क देता हूं कि C ++ सबसे जटिल भाषाओं में से एक है, लेकिन मुझे पता नहीं है कि उदाहरण के लिए Ada, PL1 या पसंद है, इसलिए शायद यह किसी अन्य भाषा की तुलना में वह जटिल नहीं है।

C ++ C की सभी जटिलता को विरासत में देता है इसलिए यह C की जटिलता स्तर से नीचे नहीं हो सकता है।

मैं अपने हिस्से के लिए कुछ स्क्रिप्टिंग भाषा और सी का उपयोग करके अधिक सहज होगा। इसलिए अंत में किसी को निम्नलिखित प्रश्न का उत्तर देना होगा। "क्या हमेशा बेहतर होता है?"


1

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

यह आवश्यक है जब एक पुरानी या पेचीदा प्रणाली में एक नई सुविधा या घटक में वायरिंग हो।

आप परिष्कृत कॉल ग्राफ़ बिल्डिंग टूल के बिना C ++ में आसानी से ऐसा नहीं कर सकते।


0

ज्यादातर लोगों को लगता है कि सी और सी ++ किसी तरह से संबंधित हैं, लेकिन वे दुखी हैं। C ++ C से बिलकुल अलग भाषा है।

C ++ में, आप वस्तुओं के संदर्भ में सोचते हैं और वे एक दूसरे से कैसे संबंधित हैं। C में, आप API के संदर्भ में सोचते हैं। यह दिन और 17 के बीच के अंतर की तरह है।

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


0

निम्नलिखित सभी कारण हैं कि किसी परियोजना को C तक सीमित करना फायदेमंद हो सकता है:

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