दिलचस्प पोस्ट
उद्देश्य-सी एआरसी: मजबूत बनाम बनाए रखने और कमजोर बनाम असाइन सी में बिट-फ़ील्ड का उपयोग कब करना है? क्या । आईओएस 8 में ओरिएंटेशन-आधारित बनने वाले बाउंस सिमुज़? यह छवि परिवर्तन कैसे करें? एसटीएल-शैली इटरेटर कैसे लागू करें और आम नुकसान से बचें? PHP: $ _SESSION के अंदर 'वस्तुओं' को संग्रहीत करना क्या C ++ std :: सेट धागा-सुरक्षित है? मैं जावास्क्रिप्ट के साथ चयन विकल्प कैसे छिपा सकता हूं? (क्रॉस ब्राउज़र) चींटी का काम केवल एक चींटी लक्ष्य को चलाने के लिए अगर कोई फ़ाइल मौजूद है? ऊपरी कैसे एक स्ट्रिंग में शब्द के प्रत्येक पहले अक्षर का केस? Json मेरे angular.js एनजी मॉडल में लोड करने के लिए कैसे? सी # में एक टेलीफोन नंबर के रूप में स्ट्रिंग को कैसे प्रारूपित करें एंड्रॉइड: वॉली HTTP अनुरोध कस्टम शीर्षलेख एक पूर्णांक को देखते हुए, मैं बिट-ट्विडिंग का उपयोग करके दो की अगली सबसे बड़ी शक्ति कैसे प्राप्त करूं? विंडोज बैच: नई लाइन के बिना गूंज

सी C ++ का सबसेट नहीं है?

मैंने बहुत सी पुस्तकों में पढ़ा है कि सी C ++ का एक सबसेट है

कुछ पुस्तकों का कहना है कि सी थोड़ा विवरण के अलावा , C ++ का सबसेट है।

कुछ मामलों में जब कोड सी में संकलित होगा, लेकिन नहीं C ++?

वेब के समाधान से एकत्रित समाधान "सी C ++ का सबसेट नहीं है?"

यदि आप C++ C89 C++ तुलना करते हैं तो यहां कुछ चीजें हैं C89

सी ++ में कोई अस्थायी परिभाषा नहीं

 int n; int n; // ill-formed: n already defined 

int [] और int [N] संगत नहीं है (कोई संगत प्रकार C ++ में नहीं)

 int a[1]; int (*ap)[] = &a; // ill-formed: a does not have type int[] 

कोई के & आर फ़ंक्शन परिभाषा शैली नहीं

 int b(a) int a; { } // ill-formed: grammar error 

नेस्टेड स्ट्रेट में क्लास-स्कोप का सी ++ है

 struct A { struct B { int a; } b; int c; }; struct B b; // ill-formed: b has incomplete type (*not* A::B) 

कोई डिफ़ॉल्ट int नहीं

 auto a; // ill-formed: type-specifier missing 

C99 अन्य मामलों की एक पूरी बहुत कुछ जोड़ता है

मापदंडों के सरणी आयामों में घोषणा विनिर्देशकों का कोई विशेष रूप से निपटने नहीं

 // ill-formed: invalid syntax void f(int p[static 100]) { } 

कोई चर लंबाई एरे नहीं

 // ill-formed: n is not a constant expression int n = 1; int an[n]; 

कोई लचीला सरणी सदस्य नहीं

 // ill-formed: fam has incomplete type struct A { int a; int fam[]; }; 

अलियासिंग विश्लेषण की सहायता करने के लिए कोई प्रतिबंधित क्वालीफायर नहीं

 // ill-formed: two names for one parameter? void copy(int *restrict src, int *restrict dst); 

सी में, sizeof('a') sizeof(int) बराबर है।

सी ++ में, sizeof('a') sizeof(char) बराबर है sizeof(char)

सी ++ के नए कीवर्ड भी हैं निम्नलिखित वैध C कोड है लेकिन C ++ के तहत संकलित नहीं होगा:

 int class = 1; int private = 2; int public = 3; int virtual = 4; 

बहुत सारी चीजें हैं सिर्फ एक सरल उदाहरण (सी साबित करने के लिए पर्याप्त होना चाहिए C ++ का एक उचित उपसमुच्चय नहीं है):

 int* test = malloc(100 * sizeof(int)); 

सी में संकलित होना चाहिए लेकिन सी ++ में नहीं

सी ++ में, यदि आप एक struct , union , या enum घोषित करते हैं, तो इसका नाम किसी योग्यता के बिना तुरंत पहुंचा जा सकता है:

 struct foo { ... }; foo x; // declare variable 

सी में, यह काम नहीं करेगा, क्योंकि प्रकार इस प्रकार अपने स्वयं के अलग-अलग नामस्थानों में रहते हैं। इस प्रकार, आपको लिखना होगा:

 struct foo { ... }; struct foo x; // declare variable 

दूसरी पंक्ति पर वहां मौजूद struct की उपस्थिति पर ध्यान दें। आपको union और enum (उनके संबंधित कीवर्ड का उपयोग करके) के लिए ऐसा करना होगा, या typedef उपयोग करना होगा:

 typedef struct { ... } foo; foo x; // declare variable 

नतीजतन, आप सी में कई प्रकार के विभिन्न प्रकार के नाम रख सकते हैं, क्योंकि आप disambiguate कर सकते हैं:

 struct foo { ... }; typedef enum { ... } foo; struct foo x; foo y; 

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

यह भी सी पर निर्भर करता है कि आप किस सी का उपयोग कर रहे हैं। Stroustrup सी + + के रूप में संगत के रूप में वह कर सकता है, और अधिक संगत, 1989 एएनएसआई और 1990 आईएसओ मानकों के साथ, और 1995 संस्करण कुछ भी नहीं बदल गया सी समिति 1 999 मानक के साथ कुछ अलग दिशा में चली गई, और सी + + समिति ने कुछ परिवर्तनों के अनुरूप अगले सी ++ मानक (शायद अगले साल या तो) को बदल दिया है

Stroustrup "सी + प्रोग्रामिंग भाषा" के विशेष परिशिष्ट B.2 में C90 / C95 के साथ असंगतताओं की सूची, विशेष संस्करण (जो कुछ अतिरिक्त सामग्री के साथ तीसरा संस्करण है):

'a' सी में एक int है, सी में एक char सी ++

एक enum का आकार सी में int है, जरूरी नहीं कि सी ++ में

सी ++ लाइन के अंत में // टिप्पणियाँ है, सी नहीं (हालांकि यह एक सामान्य एक्सटेंशन है)।

सी ++ में, एक struct foo { परिभाषा वैश्विक नाम स्थान में डालती है, जबकि सी में इसे struct foo रूप में संदर्भित किया जाता है struct foo इससे एक struct परिभाषा को बाहरी क्षेत्र में एक नाम की छायांकन करने की अनुमति मिलती है, और कुछ अन्य परिणाम भी होते हैं इसके अलावा, सी struct परिभाषाओं के लिए बड़े क्षेत्र की अनुमति देता है, और उन्हें वापसी प्रकार और तर्क प्रकार घोषणाओं में अनुमति देता है।

सामान्य में प्रकार के बारे में सी ++ फ़्यूज़ियर है यह एक पूर्णांक को एक एन्यूम के लिए आवंटित करने की अनुमति नहीं देगा, और void * ऑब्जेक्ट्स को किसी कलाकार के बिना अन्य पॉइंटर प्रकारों को असाइन नहीं किया जा सकता है। सी में, एक अधिभार प्रारंभकर्ता प्रदान करना संभव है ( char name[5] = "David" जहां सी पीछे वाले नल वर्ण को त्याग देगा)।

C89 कई संदर्भों में अनिश्चित int की अनुमति दी है, और C ++ नहीं करता है। इसका मतलब यह है कि सभी फ़ंक्शन C ++ में घोषित किए जाने चाहिए, जबकि C89 में फ़ंक्शन घोषणा में लागू होने वाली सभी चीज़ों के लिए int जाने के साथ अक्सर इसे प्राप्त करना संभव होता था।

सी में, एक लेबल के बाहर से एक लेबल कथन का प्रयोग करके अंदर जाने के लिए संभव है। सी ++ में, यह अनुमति नहीं है अगर यह एक प्रारंभिकता को छोड़ देता है

सी बाहरी संबंध में अधिक उदार है। सी में, एक वैश्विक const वेरिएबल अप्रत्यक्ष रूप से extern , और यह सी ++ में सही नहीं है सी एक वैश्विक डेटा ऑब्जेक्ट को बिना किसी extern कई बार घोषित करने की अनुमति देता है, लेकिन यह C ++ में सही नहीं है

कई सी ++ कीवर्ड सी में कीवर्ड नहीं हैं, या मानक C हेडर में #define डी हैं #define

सी की कुछ पुरानी विशेषताएं भी हैं जो किसी भी बेहतर शैली को नहीं मानी जाती हैं। सी में, आप तर्कों की सूची के बाद तर्क परिभाषाओं के साथ एक फ़ंक्शन घोषित कर सकते हैं। सी में, int foo() तरह एक घोषणा है कि foo() किसी भी तरह के तर्कों को ले सकता है, जबकि C ++ में यह int foo(void) के बराबर है।

ऐसा लगता है कि Stroustrup से सब कुछ कवर करना

मुझे लगता है कि सबसे बड़ा अंतर यह है कि यह एक वैध सी स्रोत फ़ाइल है:

 int main() { foo(); } 

ध्यान दें कि मैंने foo कहीं भी घोषित नहीं किया है

भाषा मतभेदों के अलावा, सी ++ से लाइब्रेरी में कुछ बदलाव भी होते हैं जो इसे सी से विरासत में const char * , उदा।

 #include <stdio.h> int new (int n) { return n/2; } int main(void) { printf("%d\n", new(10)); return 0; } 

सी + + अकसर किये गए सवाल भी देखें

यदि आप जीसीसी का उपयोग करते हैं, तो आप सी-कोड के बारे में चेतावनी देने के लिए चेतावनी -Wc++-compat का उपयोग कर सकते हैं जो किसी तरह से सी ++ में संदिग्ध है। इसका वर्तमान में जीसीसी ही इस्तेमाल किया गया है, और इसे हाल ही में बहुत अच्छा लगा (शायद आप जितना अच्छा कर सकते हैं, उतनी रात के संस्करण की कोशिश करें)।

(यह सख्ती से सवाल का जवाब नहीं देता, लेकिन लोक इसे पसंद कर सकते हैं)।

यहां कई उत्तर वाक्यविन्यास अंतर शामिल हैं, जो C ++ कंपाइलर्स को C89 (या C99) स्रोत कोड पर विफल करने के लिए कारण होगा। हालांकि, वहाँ कुछ सूक्ष्म भाषा अंतर है जो दोनों भाषाओं में कानूनी हैं लेकिन यह अलग व्यवहार पैदा करेगा sizeof (char) अंतर जो कि नववीन का उल्लेख किया गया है, वह एक उदाहरण है, लेकिन एक प्रोग्राम लिखें , जो एक (एएनएसआई) सी कार्यक्रम के रूप में संकलित "सी" प्रिंट करेगा, और सी ++ प्रोग्राम के रूप में संकलित अगर "सी +"

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

आप सिंटैक्स से केवल भाषाओं की तुलना नहीं कर सकते। यदि आप ऐसा करते हैं तो आप सी को C ++ के सबसेट के रूप में देख सकते हैं मेरी राय में तथ्य यह है कि सी ++ ओ ओ (और सी नहीं है) कहने के लिए पर्याप्त है कि सी और सी ++ अलग-अलग भाषा हैं