क्या मुझे C / C ++ शब्द का उपयोग करना बंद कर देना चाहिए?


140

मैं समझता हूं कि C और C ++ अलग-अलग भाषाएं हैं लेकिन जब मैं C ++ सीख रहा था तो मुझे हमेशा बताया जाता था कि C, C ++ का सबसेट है या C ++ कक्षाओं के साथ C है। और यह C ++ x0, C ++ 11 (या सामान्य रूप से आधुनिक C ++ 11/14/17) की उपस्थिति तक काफी सच था। वास्तव में (विशेषकर जब एम्बेडेड सिस्टम पर काम कर रहे हैं) यह सी ++ में लिखा कोड खोजने की बहुत संभावना है, लेकिन पूरी तरह से शुद्ध सी भाषा में लिखे गए बहुत सारे हिस्सों के साथ। यहाँ मेरे पास कई प्रश्न हैं:

  1. क्या मुझे C / C ++ शब्द का उपयोग करना बंद कर देना चाहिए?
  2. यदि # 1 का उत्तर हां है, तो मैं ऐसे प्रोग्राम को कैसे कहूंगा जो C और C ++ के मिश्रण का उपयोग करता है?
  3. यह देखते हुए कि दोनों 'अलग-अलग ’भाषाएं हैं, यह संभावना है कि कुछ बिंदु पर सी ++ कंपाइलर सी भाषा में लिखे गए कोड का समर्थन करना बंद कर दें (क्योंकि आधुनिक सी ++, मूल चीज़ों जैसे बिंदुओं, गतिशील मेमोरी हैंडलिंग आदि के लिए सी मानसिकता से विचलन कर रहा है)
  4. क्या अनुकूलता बनाए रखने के लिए C / C ++ के मानकों को बनाने वाले लोगों के बीच अभी कोई सहयोग है
  5. यदि # 4 हां है, तो इस तरह के सहयोग निकट भविष्य में आधुनिक सी ++ (11/14/17) की उपस्थिति के साथ समाप्त हो सकते हैं।

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


35
और यह C ++ x0, C ++ 11 नहीं, C89 C ++ 98 का ​​उपसमूह नहीं होने तक शांत था

35
Should I stop using the term C/C++। हाँ। यह केवल रिक्रूटर और एचआर द्वारा उपयोग किया जाता है। इंजीनियर शब्द Cया C++स्वतंत्र भाषाओं के रूप में उपयोग करेंगे। यदि आप एक इंजीनियर पाते हैं जो शब्द मिलाता है तो उनसे बचें।
मार्टिन यॉर्क

8
@ लोकीअस्तारी: सच में? मुझे लगता है कि SQLite डेवलपर HR हैं, क्योंकि उनके पास खुले स्थान नहीं हैं। यह एक अविश्वसनीय रूप से प्रतिबंधात्मक दृश्य है (कृपया जाएं और मेरे उत्तर को समाप्त कर दें जैसा कि आपकी स्थिति में अन्य लोगों ने किया है)।

4
@ ग्रेफेड: यह मान लेना बुरा है कि कोई भी, कहीं भी वर्णों के देखे गए अनुक्रम का दावा कर सकता है। "C / C ++" एक निश्चित भाषा के लिए चुना गया नाम हो सकता है, लेकिन इसका मतलब यह नहीं है कि "C / C ++" का उपयोग उस भाषा को संदर्भित करता है, अगर मैंने उस वेबसाइट को कॉपी किया और "C / C ++" को प्रतिस्थापित किया, तो इससे भी अधिक "C ++ 1z" कि प्रारूप C ++ मानक की सभी चर्चा अचानक गलत शब्दावली का उपयोग करेगी। सीधे शब्दों में कहें, स्ट्रिंग "सी / सी ++" ने कभी भी उस मजाक भाषा को "सी / सी ++" नाम नहीं दिया है और न ही कभी होगा।
बेन वोइग्ट

32
@TomDworzanski, stroustrup.com/bs_faq.html#C-is-subset "सख्त गणितीय अर्थों में, C C ++ का सबसेट नहीं है ... हालाँकि, C ++ C द्वारा समर्थित प्रत्येक प्रोग्रामिंग तकनीक का समर्थन करता है ... यह नहीं है। कुछ ही घंटों में C से C- स्टाइल C ++ की हज़ारों लाइनों को परिवर्तित करने में असामान्‍य होना। इस प्रकार, C ++ ANSI C का एक सुपरसेट है जितना ANSI C, K & R C का सुपरसेट है और ISO C ++ से अधिक है। सी ++ का सुपरसेट 1 9 85 में अस्तित्व में था। अच्छी तरह से लिखा गया सी, कानूनी सी ++ भी होता है। उदाहरण के लिए, कार्निघन और रिची में हर उदाहरण: "सी प्रोग्रामिंग लैंग्वेज (2 डी संस्करण)" भी एक सी ++ प्रोग्राम है। "
बेन

जवाबों:


183

C कभी भी C ++ का सबसेट नहीं था। इसका सबसे स्पष्ट उदाहरण है int new;। यह C89 और C ++ 98 के बाद से सही है, और भाषाएँ केवल एक दूसरे से आगे बढ़ी हैं क्योंकि नए मानक सामने आए हैं।

क्या मुझे C / C ++ शब्द का उपयोग बंद कर देना चाहिए

हाँ

यदि # 1 का उत्तर हां है, तो मैं ऐसे प्रोग्राम को कैसे कहूंगा जो C और C ++ के मिश्रण का उपयोग करता है?

एक स्रोत फ़ाइल एक भाषा या दूसरे में लिखी जाती है। एक प्रोग्राम में एक साथ काम करने वाली कई भाषाओं के कोड हो सकते हैं, या विभिन्न संकलित वस्तुओं को जोड़कर एक निष्पादन योग्य उत्पादन किया जा सकता है। आप कहेंगे कि प्रोग्राम C और C ++ में लिखा गया था, "C / C ++" कोई भाषा नहीं है।

यह देखते हुए कि दोनों 'अलग-अलग' भाषाएं हैं, यह संभावना है कि कुछ बिंदु पर सी ++ कंपाइलर सी भाषा में लिखे गए कोड का समर्थन करना बंद कर दें

3) उन्होंने कभी नहीं किया। char *a = malloc(10);C और C ++ कम से कम तब तक पूरी तरह से संगत नहीं रहे हैं जब तक उनके पास ISO मानक नहीं हैं (मुझे पूर्व-मानकीकृत दिनों के बारे में सभी जानकारी नहीं है)। लिंक पर क्लिक करें या नीचे एक फ़ाइल के लिए देखें जो C89 और ऊपर के साथ ठीक है, लेकिन किसी भी C ++ मानक के तहत मान्य नहीं है।

4) afaik नहीं, काम करने वाले समूह एक-दूसरे के बारे में जानते हैं, लेकिन मानक ऐसे निर्णय लेते हैं जो खुद के लिए सबसे अच्छे होते हैं।

/* A bunch of code that compiles and runs under C89 but fails under any C++ */

/* type aliases and struct names occupy separate namespaces in C, not in C++ */
struct S { int i; };
typedef int S;


struct Outer { struct Inner { int i; } in; };
/* struct Inner will be Outer::Inner in C++ due to name scope */
struct Inner inner;


/* default return type of int in C, C++ functions need explicit return types */
g() {
    return 0;
}


/* C sees this as two declarations of the same integer,
 * C++ sees it as redefinition */
int n;
int n;


/* K&R style argument type declarations */
void h(i) int i; { }


/* struct type declaration in return type */
struct S2{int a;} j(void) { struct S2 s = {1}; return s; }


/* struct type declaration in argument, stupid and useless, but valid */
/*void dumb(struct S3{int a;} s) { } */


/* enum/int assignment */
enum E{A, B};
enum E e = 1;


void k() {
    goto label; /* C allows jumping past an initialization */
    {
        int x = 0;
label:
        x = 1;
    }
}


/* () in declaration means unspecified number of arguments in C, the definition
 * can take any number of arguments,
 * but means the same as (void) in C++  (definition below main) */
void f();

int main(void) {
    f(1); /* doesn't match declaration in C++ */
    {
        /* new is a keyword in C++ */
        int new = 0;
    }

    /* no stdio.h include results in implicit definiton in C.  However,
     * as long as a matching function is found at link-time, it's fine.
     * C++ requires a declaration for all called functions */
    puts("C is not C++");
    {
        int *ip;
        void *vp = 0;
        ip = vp; /* cast required in C++, not in C */
    }
    return 0;
}

/* matches declaration in C, not in C++ */
void f(int i) { }

मैं हमेशा यह उल्लेख है कि सी के लायक है लग रहा है ऑब्जेक्टिव-सी के एक सबसेट।


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

20
@masonwheeler यदि ओपी यह देखना चाहता है कि C का वास्तविक सुपरसेट कैसा दिखता है।
xhainingx

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

28
@ शानदार मैं C ++ कोड लिख सकता हूं जो javacबहुत से भी चल सकता है, लेकिन बिंदु क्या होगा?
xhainingx

22
@ शानदार एक प्रोग्राम का एक उदाहरण जिसे तीन भाषाओं में संकलित किया जा सकता है - C, / bin / sh, और f77 - IOCCC 1986 में applin.c प्रविष्टि है। आपकी परिभाषा के अनुसार, टैग C/Fortran/shअब समझ में आता है ?! ioccc.org/years-spoiler.html#1986
Sjoerd

108

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

आपके बिग बॉस ने आपके द्वारा इस्तेमाल की जाने वाली सटीक भाषा के बारे में कम परवाह नहीं की। यदि वह प्रोग्रामिंग के बारे में थोड़ा जानता है, तो उसे बताएं कि आपने C / C ++ का उपयोग किया है और यह "मैं एक ऐसी भाषा का उपयोग करता हूं, जिसे DLL और सभी जटिल सामानों के साथ मशीन कोड में संकलित करने की आवश्यकता है"। यह "बाहरी संचार" भाग है।

यदि आप एक ऐसी लाइब्रेरी बनाते हैं जो C और C ++ दोनों के द्वारा इंटरफ़ेयर की जा सकती है, तो आप निश्चित रूप से इसे C / C ++ लाइब्रेरी कहना चाहते हैं। बेशक, कोई व्यक्ति हाथ उठाएगा और पूछेगा कि आप इसे C लाइब्रेरी क्यों नहीं कहते हैं जो C ++ रैपर होता है, और वैसे भी C ++ C लाइब्रेरी से लिंक हो सकता है, इसलिए आपको इसका उल्लेख करने की आवश्यकता नहीं है। बस जवाब दें: "हाँ, आप सही हैं, यह एक C / C ++ लाइब्रेरी है"। यह "आंतरिक संचार" भाग है।

यदि आप C ++ के लिए एक शाब्दिक विश्लेषक बनाते हैं, तो आपको आश्चर्य होगा कि यह C के साथ कितना अच्छा काम करता है। आपको यह सब संशोधित करने की आवश्यकता भी नहीं हो सकती है। यह "अगर यह एक बतख की तरह दिखता है, आदि" अंश।

आदि।

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

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

भविष्य से डरो मत। हमारे ऑपरेटिंग सिस्टम सी में लिखे गए हैं। C / C ++ का बहुत सा वर्तमान सॉफ्टवेयर उत्पादन C ++ में होता है। यह युगल यहां कुछ समय के लिए रहने वाला है। किसी को भी अन्य के साथ अधिक असंगत बनाने में रुचि नहीं है (वास्तव में आसपास का दूसरा तरीका)।

अपने बिंदुओं के बारे में विशिष्ट होना:

1) यह निर्भर करता है। हां जब यह भ्रम पैदा कर सकता है, जब आप असहज महसूस करते हैं, या जब यह गलत है या संदर्भ से बाहर है। नहीं, जब आपको लगता है कि यह पर्याप्त है।

2) एन / ए

3) मुझे लगता है कि नहीं, लेकिन मेरे पास कोई क्रिस्टल बॉल नहीं है।

4) कोई विचार नहीं

5) मुझे नहीं लगता कि इस दिशा में कुछ भी धक्का नहीं है


7
टिप्पणियां हटा दी गईं क्योंकि वे शोर कर रहे थे।
ChrisF

3
यह इतने सारे उभार क्यों हैं? यह अशुद्धि और झूठे दावों से भरा है!
ज़ैबिस

5
@Zaibis क्या आप इस तरह के विस्तार के लिए पर्याप्त होंगे, जिन पर दावे गलत या गलत हैं?
usernumber

3
आपके तर्क के बाद, C / C ++ / Objective-C / Fortran / Pascal को एक वैध अभिव्यक्ति होना चाहिए लेकिन यह मूर्खतापूर्ण लगता है। C / C ++ शब्द के साथ समस्या यह है कि यह कई चीजों का मतलब हो सकता है इसलिए आपको कोई गारंटी नहीं है कि यह वांछित अर्थ प्राप्त करेगा। मेरे व्यवहार में, लोग आमतौर पर इसे "C C ++ का एक पुराना आदिम संस्करण मानते हैं" और यह सिर्फ गलत है।
Martinkunev 28

4
शब्द की आंतरिक वैधता से परे, C/C++एक स्पष्ट नहीं है, और इस तरह उपयोगी नहीं है। आपके उदाहरणों के बाद, C/C++ libraryC C के रैपर के साथ C लाइब्रेरी या C रैपर के साथ C ++ लाइब्रेरी का मतलब हो सकता है। या इसका मतलब यह हो सकता है कि पुस्तकालय कई मॉड्यूल से बना है, कुछ सी ++ का उपयोग करके संकलित हैं, कुछ सी में संकलित हैं। यह बिल्कुल स्पष्ट नहीं है। मेरे लिए, यह कहना कि एक पुस्तकालय C and C++बहुत स्पष्ट है, या C library with compatibility with C++बहुत अधिक स्पष्ट है। और यहाँ अस्पष्टता केवल दो लैंग के साथ है, अधिक के लिए इस "संचार रणनीति" का उपयोग करने की कल्पना करें ...
गाबोरस

43

प्रवाह के खिलाफ जाना मैं कहूंगा कि यह संदर्भ पर निर्भर करता है

"सी / सी ++" शब्द आमतौर पर उचित नहीं है जब "यह एक सी / सी ++ प्रोग्राम है" जैसा कुछ कहा जाता है, लेकिन यह अन्य उत्तरों में गहराई से पता लगाया गया है।

हालाँकि, ऐसे संदर्भ हो सकते हैं जहाँ C / C ++ उपयुक्त हो सकता है।

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

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

16
पिछले बुलेट बिंदु वास्तव में एक बड़ी समस्या प्रदर्शित करता है: आप देख रहे हैं (1) एक व्यक्ति के लिए है कि knowns या तो सी या सी ++, (2) एक व्यक्ति है कि जानता है दोनों C और C ++ या (3) एक व्यक्ति है कि उलझन में है सुनने के लिए ये हैं विभिन्न भाषाएं। तीसरे पूल के बढ़ने में मदद न करें।
5gon12eder

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

10
लिखित भाषा में, '/' आमतौर पर एक तार्किक के रूप में व्याख्या की जाती है or, एक तार्किक के रूप में नहीं xor। तो यह एक या दोनों है। नौकरी लिस्टिंग में आप C या C ++ या दोनों जानते हैं। अब, मुझे लगता है कि बहुत से लोग इस शब्द के बारे में धार्मिक हो रहे हैं। एक अच्छा सी प्रोग्रामर पूरी तरह से ठीक होगा सी + + स्वतंत्र रूप से दोनों भाषाओं को अलग-अलग हैं। मैंने PHP को कोड करना शुरू कर दिया और फिर मैं स्काला (दो पूरी तरह से अलग-अलग भाषाओं) में चला गया, एक सी प्रोग्रामर C ++ या वाइसवर्स को लेने में सक्षम क्यों नहीं होगा? C / C ++ शब्द का कुछ गुण है यदि सही संदर्भ में उपयोग किया जाता है।
ILikeTacos

4
आप C / C ++ का उपयोग किसी ऐसे प्रोग्राम का वर्णन करने के लिए भी कर सकते हैं, जो C या C ++ के रूप में संकलित करने के लिए काम करने का इरादा रखता है, या अलग C और C ++ घटकों के साथ एक प्रोग्राम।
इमीबिस

30

सामान्य तौर पर SO उपयोगकर्ता उस व्यक्ति से पूछते हैं जो सवाल पूछ रहा है कि वह भाषा चुनें: C या C ++। क्यों?

C और C ++ के बीच कई सूक्ष्म अंतर हैं। उदाहरण के लिए, C ++ में, constवैश्विक दायरे में एक चर में आंतरिक लिंकेज है जब तक कि घोषित नहीं किया जाता है extern, लेकिन सी में बाहरी लिंकेज है जब तक कि घोषित नहीं किया जाता है static। "C / C ++" कहकर, ओपी यह ज्ञान दे रहा है कि उनके प्रश्न का उत्तर C और C ++ दोनों में समान है, जब यह बहुत अच्छी तरह से नहीं हो सकता है। यह अनावश्यक रूप से उत्तरदाताओं के लिए कठिन चीजों को बनाता है।

  • कभी-कभी हम यह देख सकते हैं कि कोड एक भाषा या दूसरे में मान्य नहीं है (उदाहरण के लिए, void*सूचक से सूचक को ऑब्जेक्ट में C ++ में मान्य नहीं हैं)। यह कष्टप्रद है। जब आप कोड का एक टुकड़ा है, जो C में मान्य है, लेकिन C ++ नहीं है, तो आप "C / C ++" क्यों कह रहे हैं? क्या आपने C को इरादा किया है, या यह C ++ होने के उद्देश्य से कोड में एक त्रुटि है?

  • कभी-कभी भाषा के आधार पर उत्तर अलग होगा (उदाहरण के लिए, चर-लंबाई सरणियाँ C99 में मौजूद हैं, लेकिन C ++ में नहीं)। यदि हम नहीं जानते कि आप किस भाषा के बारे में बात कर रहे हैं, तो या तो हमें अनुमान लगाना होगा, या दोनों के लिए एक उत्तर लिखना होगा जब केवल एक ही वास्तव में उपयोगी होगा, क्योंकि आप जानते हैं कि आप वास्तव में किस भाषा का उपयोग कर रहे हैं; आप हमें बता नहीं रहे हैं!

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

वैसे भी, आपके अन्य सवालों के जवाब देने के लिए:

  1. हाँ।

  2. यदि आप C और C ++ कोड को एक साथ जोड़ रहे हैं, तो यह दोनों टैग का उपयोग करने के लिए स्वीकार्य है, लेकिन कृपया निर्दिष्ट करें कि प्रत्येक फ़ाइल किस भाषा में है।

  3. कभी-कभी परिवर्तन होते हैं, लेकिन वे दुर्लभ हैं और आम तौर पर प्रभाव में सीमित होते हैं (अन्यथा वे अनुमोदित नहीं होते हैं)। उदाहरण के लिए, autoC ++ 11 में।

  4. मुझे नहीं लगता कि वे सीधे सहयोग करते हैं, लेकिन वे दूसरी भाषा में विकास पर ध्यान देते हैं और उन परिवर्तनों को पेश करने से बचने की कोशिश करते हैं जो संगतता को और अधिक कठिन बना देंगे।

और यदि आप वास्तव में दोनों भाषाओं के बारे में जानना चाहते हैं, तो यह ठीक है, और आप अपने प्रश्न में ऐसा कह सकते हैं। जब आप "C / C ++" कहते हैं, तो मुझे वास्तव में यकीन नहीं है कि आपका क्या मतलब है, और यह वास्तव में ऐसा लगता है जैसे आप दो भाषाओं के बारे में एक धारणा बना रहे हैं।


7
मुझे पता है कि ऐसे लोग हैं जो C और C ++ के चौराहे में कोड लिखते हैं, और टाइप करने के लिए C ++ कंपाइलर का उपयोग करते हैं, लेकिन कोड जनरेशन के लिए C कंपाइलर। हालांकि इस बात का मुझे कोई अंदाजा नहीं है कि वास्तव में यह समझ में आता है या नहीं। हालाँकि, यह एक ऐसा विषय है जो लिनक्स कर्नेल मेलिंगलिस्ट पर हर दो साल में आता है, जब कोई व्यक्ति इस कारण struct classसे कुछ इस तरह से (लिनक्स लिनक्स कर्नेल यूनिफाइड ऑब्जेक्ट-ओरिएंटेड ड्राइवर मॉडल में) का नाम बदलने के लिए एक पैच को प्रस्तुत करता है। struct klassफिर लिनस द्वारा हमेशा के लिए गोली मार दी जाती है।
जोर्ग डब्ल्यू मित्तग

3
@ JörgWMittag: मैं कभी भी किसी ऐसे व्यक्ति से नहीं मिला जिसने "C / C ++" का इस्तेमाल "C और C ++ के सामान्य उप-समूह" के लिए एक शॉर्टहैंड के रूप में किया और यह भी जानता था कि वह किस बारे में बात कर रहा था। जो लोग जानबूझकर सामान्य उपसमुच्चय में काम कर रहे हैं, वे संक्षिप्त रूप से स्पष्ट नहीं करते हैं।
बार्ट वैन इनगेन शेनौ

2
यह विशेष रूप से स्टैक एक्सचेंज प्रश्नों में C / C ++ के उपयोग के बारे में एक अच्छा जवाब है , बजाय सामान्य रूप से।
इमिबिज़ ऑक्ट

@BartvanIngenSchenau कितने std समिति के सदस्य आपसे मिले हैं?
जिज्ञासु

18

मुझे हमेशा बताया गया कि C, C ++ का सबसेट है या C ++ कक्षाओं के साथ C है। और यह C ++ x0, C ++ 11 (या सामान्य रूप से आधुनिक C ++ 11/14/17) की उपस्थिति तक शांत था।

C कभी भी C ++ का सबसेट नहीं रहा है। उदाहरण के लिए C89, C ++ 98 का ​​सबसेट नहीं है।

कुछ उदाहरण:

  • फ़ंक्शन पैरामीटर घोषणा के लिए C89 पहचानकर्ता-सूची फ़ॉर्म C ++ में समर्थित नहीं है
  • C89 और C ++ 98 में वर्ण स्थिरांक के लिए विभिन्न प्रकार हैं
  • C89 और C ++ 98 में स्ट्रिंग लिटरल के लिए अलग-अलग प्रकार हैं
  • तार्किक ऑपरेटर C89 और C ++ 98 ( intबनाम bool) में विभिन्न प्रकारों का उत्पादन करते हैं
  1. क्या मुझे C / C ++ शब्द का उपयोग करना बंद कर देना चाहिए?

हाँ।

  1. यदि # 1 का उत्तर हां है, तो मैं ऐसे प्रोग्राम को कैसे कहूंगा जो C और C ++ के मिश्रण का उपयोग करता है?

एक प्रोग्राम या तो C या C ++ है (यदि कुछ बहुत ही बेसिक प्रोग्राम को C या C ++ कंपाइलर के साथ भी संकलित किया जा सकता है)। आप इसे संकलित करने के लिए किस संकलक का उपयोग कर रहे हैं? इसे आपके प्रश्न का उत्तर देना चाहिए। हार्बिसन और स्टील ने सी और सी ++ का एक सामान्य सबसेट नामित करने के लिए क्लीन सी शब्द को गढ़ा, लेकिन मुझे लगता है कि यह एक बुरा विचार था।

EDIT : हालाँकि मैं मानता हूँ कि तकनीकी रूप से आप C और C ++ ऑब्जेक्ट्स को एक ही प्रोग्राम में लिंक कर सकते हैं, लेकिन OTH में कई भाषाएँ हैं, जिन्हें जावा और C ++ के उदाहरण के लिए एक ही प्रोग्राम में मिलाया जा सकता है। मुझे लगता है कि शब्द C / C ++ प्रोग्राम का उपयोग केवल इस भ्रम में जोड़ता है कि इसे C / C ++ नामक एकल भाषा में लिखा गया है।

  1. यह देखते हुए कि दोनों 'अलग-अलग ’भाषाएं हैं, यह संभावना है कि कुछ बिंदु पर सी ++ कंपाइलर सी भाषा में लिखे गए कोड का समर्थन करना बंद कर दें (क्योंकि आधुनिक सी ++, मूल चीज़ों जैसे बिंदुओं, गतिशील मेमोरी हैंडलिंग आदि के लिए सी मानसिकता से विचलन कर रहा है)

कई विशेषताएं हैं (उदाहरण: चर लंबाई सरणी, लचीला सरणी सदस्य _Generic, ...) C99 या C11 का जो किसी भी ++ संस्करण द्वारा समर्थित नहीं हैं।


बहु-भाषा कार्यक्रम: जेएनआई का उपयोग करने वाले कार्यक्रम को बड़े पैमाने पर C / Java प्रोग्राम कहा जा सकता है। तथ्य यह है कि दो भाषाओं का एक साथ उपयोग किया जाता है इसका मतलब यह नहीं है कि वे एक साथ संकलित हैं।
इमिबिज़ ऑक्ट

1
stroustrup.com/bs_faq.html#C-is-subset "सख्त गणितीय अर्थ में, C, C ++ का सबसेट नहीं है ... हालाँकि, C ++ C द्वारा समर्थित प्रत्येक प्रोग्रामिंग तकनीक का समर्थन करता है ... यह असामान्य नहीं है कुछ घंटों में दसियों सी को सी-स्टाइल सी ++ में परिवर्तित करने में सक्षम। इस प्रकार, C ++ ANSI C का एक सुपरसेट है जितना ANSI C, K & R C का सुपरसेट है और ISO C ++ का एक सुपरसेट है। जैसा कि यह 1985 में अस्तित्व में था । अच्छी तरह से लिखा गया C, कानूनी C ++ भी है। उदाहरण के लिए, कार्निघन और रिची में हर उदाहरण: "C प्रोग्रामिंग लैंग्वेज (दूसरा संस्करण)" भी C ++ प्रोग्राम है। "
बेन

@ पहला प्रोग्राम (हेल्लो वर्ल्ड) "द सी प्रोग्रामिंग लैंग्वेज (2 डी एडिशन)" में मुख्य प्रकार के रिटर्न को छोड़ देता है जो C ++ में अमान्य है।
औहा

1
@ouah, ऐसा लगता है कि प्रोफेसर स्ट्रॉस्ट्रुप एक से चूक गए :-) नोट सी 11 में अनुमति नहीं है या तो :-) बहुत सुंदर है, हालांकि सी + + के पुराने संस्करणों में इसकी अनुमति दी गई थी।
बेन

4
@ouah, यह C ++ का पहला संस्करण नहीं है। पुस्तक 1988 से है और उस समय न तो भाषा आईएसओ मानक थी। उस समय C ++ का वर्तमान संस्करण Bjarne Stroustrup की 1985 की पुस्तक थी।
बेन

17

कुछ प्रोग्राम C और C ++ के मिश्रण में लिखे गए हैं

यह जीवन का एक तथ्य मात्र है। आप C और C ++ से ऑब्जेक्ट फ़ाइलों को संकलित कर सकते हैं और उन्हें एक साथ जोड़ सकते हैं। परिणाम को काफी हद तक "C / C ++ प्रोग्राम" कहा जा सकता है।

लेकिन यह केवल एक पूरे के रूप में कार्यक्रम है। व्यक्तिगत संकलन इकाइयों के बारे में क्या?

C का एक सबसेट है जो C ++ का सबसेट भी है

उस उपसमुच्चय में लिखा गया एक कार्यक्रम (या संकलन इकाई) संकलित सी और सी ++ संकलक के तहत एक ही संकलन और व्यवहार करेगा। इस तरह के प्रोग्राम या फाइल को "C / C ++ प्रोग्राम" या "C / C ++ फाइल" कहा जा सकता है।

हेडर फ़ाइल जैसे आंशिक कार्यक्रम का उपयोग C और C ++ प्रोग्राम दोनों में किया जा सकता है। इस तरह की हेडर फाइल को C / C ++ हेडर के रूप में संदर्भित किया जा सकता है।

कोटिंग प्रोफेसर बज़्ने स्ट्रॉस्ट्रुप:

C, C ++ का उपसमूह है?

सख्त गणितीय अर्थ में, C, C ++ का सबसेट नहीं है। ऐसे प्रोग्राम हैं जो सी मान्य हैं लेकिन सी ++ मान्य नहीं हैं और कोड लिखने के कुछ तरीके भी हैं जिनका सी और सी ++ में एक अलग अर्थ है। हालाँकि, C ++, C द्वारा समर्थित हर प्रोग्रामिंग तकनीक का समर्थन करता है। प्रत्येक C प्रोग्राम को अनिवार्य रूप से C ++ में उसी प्रकार से लिखा जा सकता है, जिसमें समान रन-टाइम और स्पेस दक्षता हो। कुछ ही घंटों में ANSI C से C- शैली C ++ की हजारों लाइनों को परिवर्तित करने में सक्षम होना असामान्य नहीं है। इस प्रकार, C ++ ANSI C का एक सुपरसेट है जितना ANSI C, K & R C का सुपरसेट है और जितना ISO C ++ का एक सुपरसेट है, वह 1985 में मौजूद था।

अच्छी तरह से लिखा C कानूनी C ++ भी है। उदाहरण के लिए, कार्निघन और रिची में हर उदाहरण: "सी प्रोग्रामिंग लैंग्वेज (2 डी संस्करण)" भी एक सी ++ प्रोग्राम है।

तो हाँ सी / सी ++ जैसी कोई चीज़ है। यह कुछ भी है जो वैध सी और वैध सी ++ दोनों है।

C प्री-प्रोसेसर C भाषा का हिस्सा है। C ++ पूर्व-प्रोसेसर C ++ भाषा का हिस्सा है

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

यदि कार्यक्रम अनिवार्य रूप से समान है, लेकिन अतिरिक्त सुविधाओं के साथ, यह कहना बिल्कुल गलत नहीं है कि यह एक ही कार्यक्रम है। यह वही है, लेकिन यह भी अलग है।

अधिकांश C प्रोग्रामर कम से कम C ++ और इसके विपरीत कर सकते हैं

ऐसे व्यक्ति को C / C ++ प्रोग्रामर कहना अनुचित नहीं होगा। हां, वे शायद एक में विशेषज्ञ हैं, लेकिन क्या कोई है जो एक सक्षम सी या सी ++ प्रोग्रामर है जो सचमुच किसी अन्य भाषा में नहीं कर सकता है ? एक तरह से, वे सभी C / C ++ प्रोग्रामर नहीं हैं?

"C / C ++" कहने में कुछ गलत नहीं है। किन मामलों को समझा जा रहा है

अंग्रेजी भाषा सिओलोगिज़्म को व्यक्त करने का एक उपकरण नहीं है । आप तर्क के लिए अंग्रेजी का उपयोग कर सकते हैं, लेकिन केवल और केवल महान प्रयास के साथ।

इसका कारण यह है कि शब्दों का स्वाभाविक रूप से सटीक अर्थ नहीं होता है, बल्कि अर्थ और अर्थों का एक अस्पष्ट बादल होता है। क्या फर्क पड़ता है अगर लोग समझते हैं कि आप क्या कह रहे हैं।


5
@ B @овиЈ वे शब्दावली के एक छोटे से टुकड़े की स्वीकार्यता के बारे में आपसे असहमत हैं इसलिए आप निष्कर्ष निकालते हैं कि वे अंतर को नहीं समझते हैं और अक्षम हैं। यह कहना बहुत अनुचित बात है।
बेन

4
@ el.pescado हाँ। आप पाएंगे कि लोग वास्तव में PHP / जावास्क्रिप्ट को देखें। क्यों नहीं? बिंदु को समझना है, शब्दों के साथ खेल नहीं खेलना है।
बेन

10
@ B @овиЈ आप कोई मतलब नहीं बना रहे हैं। वे "पूरी तरह से अलग" नहीं हैं। C ++ C की तुलना में बहुत बड़ी भाषा है, लेकिन इसमें लगभग सभी C शामिल हैं। असंगतताएं हैं जो सी ++ को एक उचित सुपरसेट होने से रोकती हैं लेकिन वे छोटे हैं, जैसे कि अतिरिक्त आरक्षित शब्द, कुछ और जातियां आवश्यक हो जाती हैं, लेकिन यह बहुत अधिक है। यह लगभग एक उचित सुपरसेट है, बस काफी नहीं है।
बेन 15

7
@ B IовиЈ शायद आपने यह नहीं समझा कि मैंने क्या लिखा है। आप यहां यह देखने के लिए क्यों नहीं दिखते हैं कि हर मामले में C प्रोग्राम को कैसे अनुकूलित किया जा सकता है ताकि यह C ++ के रूप में भी संकलित हो। david.tribble.com/text/cdiffs.htm#C99-vs-CPP9
Ben

7
@ B @овиЈ यदि आप शब्दावली के बारे में पांडित्यपूर्ण हैं, तो आपको पता होना चाहिए कि C " कार्यात्मक " नहीं है, बल्कि " प्रक्रियात्मक " है - ऐसा अंतर जिसे आप दूसरों पर अक्षमता का आरोप लगाने से पहले समझने की इच्छा कर सकते हैं।
आरएम

15
  1. क्या मुझे C / C ++ शब्द का उपयोग करना बंद कर देना चाहिए?

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

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

मेरा सुझाव है कि "C / C ++" के बारे में बात करने के बजाय आप एक ऐसे शब्द का उपयोग करें जो वास्तव में आपका मतलब स्पष्ट करता है।

  • यदि आप C में ऐसी किसी चीज़ के बारे में बात कर रहे हैं जो C ++ के लिए भी सही हो सकती है या नहीं भी हो सकती है, तो बस C कहें ।

    उदाहरण: फ़ंक्शन को C में कैसे mainघोषित किया जाना चाहिए ?

    सबसे पहले, ऐसा लग सकता है कि C ++ का उत्तर समान है: int main()या int main(int, char**)। लेकिन जैसा कि चर्चा चल रही है, यह इंगित करना प्रासंगिक हो सकता है कि सी ++ में, फ़ंक्शन को वैश्विक दायरे में घोषित किया जाना है, जो सी में समझ में नहीं आता है, क्योंकि इसका कोई namespaceएस नहीं है । दूसरी ओर, C mainपुनरावर्ती कॉल करने की अनुमति देता है जबकि C ++ नहीं करता है। C ++ में, एक निहितार्थ है return 0;यदि आप "गिर जाते हैं" mainलेकिन C में returnकिसी भी पथ पर विवरण आवश्यक है। सूची आगे बढ़ती है और यह चर्चा को और सरल बना देता है यदि आप इसे स्पष्ट कर दें कि जिस भाषा पर चर्चा की जानी है वह क्या है।

  • यदि आप C ++ में किसी ऐसी चीज के बारे में बात कर रहे हैं जो C के लिए भी सही हो सकती है या नहीं भी हो सकती है, तो बस C ++ कहें ।

    उदाहरण: क्या सी का एक malloc()सरणी सरणी intशुरू में सी ++ में ऑल-जीरो होगा?

    C के लिए संक्षिप्त उत्तर समान होना चाहिए: नहीं। लेकिन जैसा कि उत्तर चलता है, यह इंगित करने के लिए सार्थक हो सकता है कि सी में, callocएक अच्छा विकल्प होगा जबकि सी ++ std::vector<int>में, पहले स्थान पर एक बेहतर विकल्प हो सकता है।

  • यदि आप C और C ++ के बीच समानता को इंगित करना चाहते हैं, तो C और C ++ कहें ।

    उदाहरण: C और C ++ में, sizeofएक intकार्यान्वयन परिभाषित किया गया है और संकलनकर्ता और आर्किटेक्चर के बीच भिन्न हो सकते हैं।

    यहाँ, हम यह बताना चाहते हैं कि C और C ++ समान व्यवहार करते हैं। हम स्पष्ट रूप से दोनों भाषाओं के बारे में बात कर रहे हैं।

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

C ++ समर्थन /* … */और // …टिप्पणी करता है जबकि C केवल /* … */शैली का समर्थन करता है।

न तो सही है और न ही गलत है।

  1. यदि # 1 का उत्तर हां है, तो मैं ऐसे प्रोग्राम को कैसे कहूंगा जो C और C ++ के मिश्रण का उपयोग करता है?

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

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

हालाँकि, अगर, इसके बजाय, लेखकों ने प्रत्येक फ़ाइल को इस तरह से लिखने में बहुत सावधानी बरती है कि इसे C या C ++ कंपाइलर के साथ संकलित किया जा सके और परिणामी प्रोग्राम वही काम करेगा, तो आप कह सकते हैं कि "प्रोग्राम C और C ++ के एक सामान्य सबसेट में लिखा गया है

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

  1. यह देखते हुए कि दोनों "अलग-अलग" भाषाएं हैं, यह संभावना है कि कुछ बिंदु पर सी ++ कंपाइलर सी भाषा में लिखे गए कोड का समर्थन करना बंद कर देते हैं (क्योंकि आधुनिक सी ++ बिंदुओं, गतिशील मेमोरी हैंडलिंग आदि जैसे बुनियादी सामान के लिए सी मानसिकता से विचलन कर रहा है)?

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

  1. क्या अनुकूलता बनाए रखने के लिए C / C ++ के मानक बनाने वाले लोगों के बीच अभी कोई सहयोग है?

हाँ। मेमोरी मॉडल और परमाणु संचालन पुस्तकालय C ++ 11 और C11 में पेश किया गया एक अच्छा उदाहरण है। ऐसा लगता है कि दोनों भाषाओं के डिजाइनरों को एहसास है कि संगतता महत्वपूर्ण है और इसे सुधारने की दिशा में काम कर रहे हैं। व्यक्तिगत रूप से, मैं चाहूंगा कि सहयोग और अधिक तीव्र हो और दो आईएसओ काम करने वाले समूह भी शायद शामिल हों, लेकिन मेरी इच्छाएं महत्वपूर्ण नहीं हैं।

Bjarne Stroustrup , C ++ प्रोग्रामिंग लैंग्वेज के 4th संस्करण के edition 44.3 में C और C ++ के विभिन्न संस्करणों के बीच अंतर और समानता के बारे में बात करता है, जिसे विडंबना कहा जाता है, जिसे "C / C ++ संगतता" कहा जाता है। इस मामले में इस शब्द का उपयोग वास्तव में उचित हो सकता है क्योंकि यह स्पष्ट है कि इसका मतलब क्या है।

  1. यदि # 4 हां है, तो इस तरह के सहयोग निकट भविष्य में आधुनिक C ++ (11/14/17) की उपस्थिति के साथ समाप्त हो सकते हैं

जैसा कि ऊपर चर्चा की गई है, यह C ++ 11 में हुआ और फिर से होने की उम्मीद / उम्मीद / अपेक्षित है।


यह न तो सही हो सकता है और न ही गलत?
JDługosz

4
यह एक अच्छी तरह से परिभाषित सत्य मूल्य नहीं है जैसा कि इस कथन के साथ है कि "हरी चीजें महंगी हैं"। सी और सी ++ के संस्करणों के एक विशेष संयोजन के लिए यह सच है, दूसरों के लिए यह गलत है।
5gon12eder 7

5

C / C ++ C और C ++ का प्रतिच्छेदन है।

int new;C / C ++ नहीं है, और न ही है vector<int> foo;

इसी तरह, C89 / C99 इन दो भाषाओं, जहां न तो के चौराहे है enum bool { false, true };या for(int i = 0;;)अनुमति दी है।

और सी ++ 11 / सी ++ 14, आदि।

C ++ 11 और C ++ 14 के तहत संकलित (और सही ढंग से चलने वाले) कोड लिखना संभव है, भले ही एक के तहत संकलन करने का मतलब यह नहीं है कि यह दूसरे के तहत संकलन करता है। वास्तव में, बहुत सारे लोग ऐसा करते हैं।

और बहुत से लोग C और C ++ में काम करने वाले कोड लिखते हैं।

स्पष्ट रूप से, अधिक से अधिक ओवरलैप, जितना अधिक समझ में आता है; मुझे C / C ++ / Java कोड के बारे में कोई प्रश्न देखने की उम्मीद नहीं है।


हालाँकि यह इन भाषाओं के एक सामान्य उपसमूह के बारे में बात करने के लिए "समझ में" आता है, कई सवालों के जवाब इस उपसमुच्चय में नहीं होंगे, उदाहरण के लिए मुख्य () C और C ++ में क्या लौटना चाहिए?

लेकिन आप उन कोड के बारे में बात कर सकते हैं जो कई भाषा विनिर्देशों के लिए काम करते हैं, चाहे वे ऐनक "संस्करण" या "भाषा के नाम" से भिन्न हों या नहीं।


3

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


मेरा तर्क है कि उस व्याख्या को भी सावधानी के साथ लिया जाना चाहिए।

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

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

मैं इन दिनों व्यवसाय में नहीं हूं (यहां तक ​​कि उस हद तक भी जब मैं स्टैक ओवरफ्लो अपनी प्रारंभिक अवस्था में था), इसलिए मैं इस बात का अनुमान नहीं लगाता कि कितनी बार या तो काल्पनिक साक्षात्कार में क्रॉस-ओवर कौशल नहीं होगा, लेकिन मुझे लगता है कि सबसे अधिक बार लागू होने वाली भाषाएं अब वास्तव में बहुत अलग हैं।

संक्षेप में "C / C ++" को न केवल तकनीकी संदर्भों में, बल्कि अधिकांश व्यावसायिक संदर्भों में भी गिरा दिया जाना चाहिए।


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

2

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

और यह C ++ x0, C ++ 11 (या सामान्य रूप से आधुनिक C ++ 11/14/17) की उपस्थिति तक शांत था।

C ++ 98 और 03 भी दूरस्थ रूप से C वर्ग के साथ नहीं हैं। जिसने आपको सिखाया है वह बकवास नहीं जानता है और आप उन्हें भूल सकते हैं। यह कभी सही नहीं था।


यह पूरी तरह से सच नहीं है। एक समय में एक पृष्ठ था जिसने "C / C ++" नामक भाषा के लिए एक प्रस्तावित भाषा युक्ति का वर्णन किया था, जो अन्य चीजों के अलावा, एक प्रकार की प्रणाली की अनुपस्थिति (निर्दिष्ट) के बीच थी। अफसोस की बात है कि तब से पेज को नीचे ले जाया गया है, और जिस साइट ने इसे होस्ट किया है, वह एक रोबोट है।
ग्रेफेड

1
अहा, मुझे पुरालेख पर एक प्रति मिली है ।is: Rationale , Syntax और शब्दार्थ
ग्रेफेड

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

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

3
यह ऐसा नहीं है कि "हर कार्यक्रम या तो सी, या सी ++ है।" प्रो। बज़्ने स्ट्रॉस्ट्रुप कहते हैं: 'अच्छी तरह से लिखा गया C, कानूनी C ++ भी है। उदाहरण के लिए, कार्निघन और रिची में हर उदाहरण: "सी प्रोग्रामिंग लैंग्वेज (2 डी संस्करण)" भी एक सी ++ प्रोग्राम है। ' stroustrup.com/bs_faq.html#C-is-subset
बेन

1

वैचारिक रूप से, C स्रोत फ़ाइलों को डिज़ाइन करने में कोई विशेष कठिनाई नहीं होनी चाहिए, ताकि उन्हें C ++ की तरह संकलित किया जा सके। वास्तव में ऐसा करने के कुछ महत्वपूर्ण फायदे हो सकते हैं। उदाहरण के लिए, जब एम्बेडेड सिस्टम के लिए कोड लिखना कभी-कभी एक होस्ट किए गए पीसी वातावरण पर कोड का परीक्षण करने में सक्षम होना सहायक होता है। यदि कोड सी ++ के रूप में सफाई से संकलित करता है, तो "मोटर_नेबल = 1;" जैसा बयान देना संभव है। एम्बेडेड सिस्टम पर एक अस्थिर I / O बिट के लिए लिखें (सी के रूप में संकलित), लेकिन पीसी पर अनुकरण तर्क को ट्रिगर करें (सी ++ के रूप में संकलन)। संभवतः पीसी पर C ++ प्रकार डिज़ाइन करना भी संभव होगा, जो कि छोटे एम्बेडेड सिस्टम पर एक uint16_t व्यवहार करने के तरीके का व्यवहार करेगा (ताकि उदाहरण के लिए u16 x=65533;, एक संकलक के मूल्य का संबंध होगाx*xनौ के रूप में, इसके बजाय कुछ भी करने के लिए स्वतंत्र शासनकाल होने के बजाय), हालांकि अभी तक मेरे किसी भी एमुलेटर ने इसमें शामिल नहीं किया है [क्योंकि सी ++ संकलक जो मैंने उपयोग किया है, उसने ऐसे मामलों में कुछ भी निराला नहीं किया है]।

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

जबकि C89 और C ++ 98 का ​​प्रतिच्छेदन एक काम करने योग्य भाषा है, C के बाद के संस्करणों के C के साथ बाद के संस्करणों के प्रयोग करने योग्य सुपरसेट संभवतः बड़े हो गए हैं (सख्त एलियासिंग नियम जैसी चीजों के लिए धन्यवाद) और रुझान कभी भी अनुकूल हो जाते हैं- बढ़ती विदर।


1
"C ++ 95" क्या है? एक तकनीकी रिपोर्ट?
बेन Voigt

1
यदि आप अपने आंतरिक कार्यों के लिए ओवरलोडिंग चाहते हैं, लेकिन आपके बाहरी लोगों के लिए कोई नाम नहीं है, तो आप पूर्व को एक अनाम में डाल सकते हैं namespaceऔर बाद वाले को घोषित कर सकते हैं extern "C", फिर C ++ कंपाइलर का उपयोग कर सकते हैं।
5gon12eder

@BenVoigt: Mea gupa। मुझे इसे देखना चाहिए था। C ++ से पहले C ++ संस्करण। जब C89 बाहर आया, तो उसने C ++ की तरह C को अधिक बनाने की कोशिश की, लेकिन C99 ने उचित संख्या में विशेषताएं जोड़ीं, जिनमें C ++ निश्चित रूप से दिलचस्पी नहीं ले रहा था (उदाहरण चर-लंबाई सरणियों)। मैं C ++ में ज्यादा प्रोग्राम नहीं करता, लेकिन मुझे लगता है कि कुछ और C ++ फीचर्स से C को अधिक मदद मिलेगी, इससे ज्यादा डिवैजेंट फीचर ने मदद की है।
14

@ 5gon12eder: मैंने C ++ कोड को C प्रोजेक्ट में लिंक करने का कभी प्रयास नहीं किया है। क्या यह वास्तव में उतना ही सरल है जितना सब कुछ या तो स्थिर / इनलाइन होना या extern "C"या अन्य जटिलताओं के साथ-साथ (जैसे स्थैतिक-वस्तु आरंभीकरण, आदि) हो? क्या इसे बनाने के लिए C ++ में कोई तरीका है ताकि foo(1234)एक foo_const(1234)मैक्रो का आह्वान किया जा सके foo(x)[ जबकि xएक स्थिरांक नहीं है] एक foo_var(x)फ़ंक्शन को लागू करेगा ? एम्बेडेड कोड में कई स्थितियां हैं, जहां यह "फ़ंक्शन" के लिए समझ में आ सकता है जैसे SET_PORT(port, state)कि पोर्ट और राज्य दोनों के आधार पर तीन-रूप हैं ...
Supercat

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