2008-11-20 19 views
10

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

संपादित करें: यह वास्तव में समान है, लेकिन this question का सटीक डुप्लिकेट नहीं है।

+0

बिल मैंने दूसरे प्रश्न के विषय को विशेषीकृत किया, क्योंकि विषय प्रश्न का प्रतिनिधि नहीं था। –

+0

मुझे लगता है कि आप सही हैं। प्रश्न का उद्देश्य (और दिए गए उत्तरों) इसे खोलने के लिए काफी अलग है। –

उत्तर

27

सामान्यतः, हाँ सी कोड को C++ कोड माना जाता है।

लेकिन सी सख्त अर्थ में उचित सबसेट नहीं है। कुछ अपवाद हैं।

यहाँ सी में कुछ वैध चीजें हैं जो C++ मान्य नहीं हैं कर रहे हैं:

int *new;//<-- new is not a keyword in C 
char *p = malloc(1024); //void * to char* without cast 

वहाँ अधिक उदाहरण भी हैं, लेकिन आप विचार मिलता है।

मैंने पहले इसी तरह के प्रश्न here में एक अधिक व्यापक उत्तर लिखा था।

+1

वाह, दो मिनट! ऐसा लगता है कि आप किसी सवाल पर पूछने के लिए बस इंतजार कर रहे थे। :) –

+1

मैं 37 दिनों के लिए रीफ्रेशिंग नॉन स्टॉप कर रहा हूं, और आखिरकार आपने इसे पूछा;) –

+0

तकनीकी रूप से वे एक साथ संकलित करते हैं (जैसा ऊपर बताया गया है)। लेकिन एक सी ++ फ़ाइल (कक्षाओं के साथ उर्फ ​​सी) में सी कोड लिखना इसका मतलब यह नहीं है कि यह सी ++ है। प्रत्येक भाषा के लिए शैलियों बस इतना ही अलग है, सी से सी ++ में जाने से एक नई भाषा सीखना है। सी ++ से सी तक चलना बहुत दर्दनाक है। –

2
typedef struct { 
    int a, b, c; 
} st; 

st s = { 
    .a = 1, 
    .b = 2, 
}; 

यह वैध सी कोड है जो सबसे सी ++ compilers में संकलन नहीं करता है। जहां तक ​​मुझे पता है, यह सी ++ spec का हिस्सा नहीं है। हालांकि, कुछ सी ++ कंपाइलर्स भाषा के कुछ हिस्सों के साथ "उदार" हैं और उन चीजों को अनुमति नहीं देते हैं, जैसे कि कल्पना में कुछ नतीजों पर बहुत याद आती है लेकिन लगभग कभी नहीं उपयोग की जाती है।

+0

मुझे लगता है कि कारण संकलक इसे स्वीकार करेंगे यदि आप सी 99 संगतता ध्वज सेट करते हैं, या इसे बंद नहीं करते हैं । –

1

मुझे लगता है कि यह कहना सही हो सकता है कि एएनएसआई सी सी ++ का सबसेट है। नहीं & आर सी

+0

के एंड आर सी (मेरे सामने बैठे दूसरे संस्करण) एएनएसआई सी –

+1

के एंड आर सी प्री-स्टैंडर्ड सी (के एंड आर 1 एडन) के लिए बोलचाल शब्द है। –

+0

@ जोनाथन: धन्यवाद। मैं नहीं जानता था कि। –

1

Is it true that there is no need to learn C because C++ contains everything भी देखें। सी और सी ++ का एक बड़ा आम सबसेट है; सी ++ में बहुत से एक्सटेंशन हैं जो सी में नहीं हैं; सी में कुछ बिट्स हैं जो सी ++ में नहीं हैं (ज्यादातर बिट्स जिन्हें आप उपयोग नहीं करना चाहते हैं); और कुछ बिट्स हैं जो सी और सी ++ में हैं लेकिन अलग हैं।

5

अन्य चीजें हैं जो वैध सी नहीं बल्कि सी ++ हैं की एक जोड़े:

int new; //Obviously an error in C++ 
+0

मुझे पूरा यकीन है कि आपका पहला उदाहरण गलत है। Comau इसे अस्वीकार करता है। यदि आप पैरामीटर सूची प्रदान करते हैं, तो आपको इसका सम्मान करना होगा। यदि आप पैरामीटर सूची को खाली छोड़ देते हैं, तो आप अपने इच्छित पैरामीटर को पास कर सकते हैं। –

+0

आप सही हैं। मैंने इसे संपादित किया। –

5

एक बात है कि दो सेट:

int func(); 
func(0,0); //Error in C++, but not in C 

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

7

कुछ और:

सी मुख्य करने के लिए पुनरावर्ती कॉल की अनुमति देता है, सी ++ करता

char foo[3] = "abc" नहीं कानूनी सी, नहीं सी ++

sizeof('A') == sizeof(int) सी में सच्चे और सी में गलत है ++

है सी 99

के साथ और भी अधिक परिवर्तन हैं संपादित करें: मुझे एक पोस्ट मिली अधिकांश मतभेदों की सूची है।किसी भी वस्तु को void * से

  1. ऑटो रूपांतरण/अधूरा प्रकार
  2. नए कीवर्ड (इनमें से एक नंबर)
  3. कारण struct को रों: http://c-faq.com/misc/cplusplus.nr.html

    क्यों सी सी की ++ उचित सबसेट नहीं है का सारांश

  4. struct टैग typedef एस
  5. प्रोटोटाइप होने के कारण आवश्यक
  6. निहित int नियम
  7. main
  8. को
  9. रिकर्सिव कॉल कारण // के लिए टिप्पणियों
  10. चरित्र शाब्दिक प्रकार char होने के कारण और नहीं int आदि
+0

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

+0

मुझे इसका कोई संदर्भ नहीं मिल रहा है, मुझे याद है कि यह comp.lang.c में बहुत कुछ आया था जब लोग सी/सी ++ के साथ मदद की तलाश में आए थे, जिससे नियमित रूप से बाहर निकलते थे और चिल्लाते थे "वे अलग-अलग भाषाएं हैं ! " –

+1

ध्यान दें कि // सी 99 में अनुमति है - जो वर्तमान सी मानक है। –

12

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

सी और सी ++ के बीच असंगतताओं की विस्तृत सूची के लिए, सी 99 के साथ परिवर्तन सहित, http://david.tribble.com/text/cdiffs.htm देखें।

संबंधित मुद्दे