C, C99, ANSI C और GNU C में क्या अंतर है?


123

मैंने codechef पर प्रोग्रामिंग अभ्यास शुरू कर दिया है और सी और सी 99 के बीच के अंतर से भ्रमित हो गया है यहाँ C का क्या अर्थ है? यह C89 है? इस सबमिट के निचले भाग पर स्थित भाषाओं की जाँच करें । इसमें C और C99 दोनों शामिल हैं।

मैंने इंटरनेट पर पाया कि कुछ ग्नू सी कहलाता है। क्या लिनक्स / यूनिक्स सिस्टम के लिए अलग सी है? क्या ANSI द्वारा C मानकों के अनुरूप हैं? मैंने कुछ जगहों पर "C99 सख्त" भी पढ़ा है। यह क्या है?

क्या उपयोग में C के कोई अन्य भिन्न मानक हैं? क्या सी 4.3.2 नामक कोई चीज है या यह वर्तमान उपयोग में gcc संस्करण है?

संपादित करें:

यह , यह , इससे मदद मिली। मैं और खोज करूंगा और उन चीजों को संपादित करूंगा जो अनुत्तरित हैं।

मैं एक प्रोग्रामिंग नौसिखिया नहीं हूँ। मुझे पता है कि सी भाषा क्या है। मुझे पता है कि C89, C99 और C11 जैसे ANSI द्वारा विभिन्न C मानक हैं।


@Will मैंने बहुत खोज नहीं की थी। मैंने अब किया। मैं और करूंगा। और प्रश्न को अधिक संपादित करें।
अज़ीम बंसल

@Will मुझे C99 के बारे में सख्त पता नहीं चल पाया है और क्या C कोडेक्स में C89 है या पहले गैर-मानकीकृत मूल C.
असीम बंसल

1
POSIX C :-)
pmg

जवाबों:


216
  • मानकीकरण से पहले सब कुछ आम तौर पर "केएंडआर सी" कहा जाता है, प्रसिद्ध पुस्तक के बाद , डेनिस रिची, सी भाषा के आविष्कारक के साथ, लेखकों में से एक के रूप में। यह 1972-1989 की "सी भाषा" थी।

  • पहला C मानक 1989 में राष्ट्रीय स्तर पर USA में जारी किया गया था, उनके राष्ट्रीय मानक संस्थान ANSI द्वारा। इस रिलीज़ को C89 या ANSI-C कहा जाता है। 1989-1990 तक यह "सी भाषा" थी।

  • इसके एक साल बाद, अमेरिकी मानक को अंतरराष्ट्रीय स्तर पर स्वीकार किया गया और आईएसओ (आईएसओ 9899: 1990) द्वारा प्रकाशित किया गया। इस रिलीज़ को C90 कहा जाता है। तकनीकी रूप से, यह C89 / ANSI-C के समान मानक है। औपचारिक रूप से, इसने C89 / ANSI-C को बदल दिया, जिससे वे अप्रचलित हो गए। 1990-1999 से, C90 "सी भाषा" थी।

    कृपया ध्यान दें कि 1989 से, ANSI को C भाषा से कोई लेना-देना नहीं है। प्रोग्रामर अभी भी "एएनएसआई सी" के बारे में बोल रहे हैं, आमतौर पर इसका कोई मतलब नहीं है कि इसका क्या मतलब है। आईएसओ आईएसओ 9899 मानक सी के माध्यम से "भाषा" का मालिक है।

  • 1995 में एक मामूली अपडेट जारी किया गया था, जिसे कभी-कभी "C95" कहा जाता था। यह एक बड़ा संशोधन नहीं था, बल्कि औपचारिक रूप से ISO / IEC 9899: 1990 / Amd.1: 1995 नाम का एक तकनीकी संशोधन था। मुख्य परिवर्तन व्यापक चरित्र समर्थन का परिचय था।

  • 1999 में, C मानक एक प्रमुख संशोधन (ISO 9899: 1999) से गुजरा। मानक के इस संस्करण को C99 कहा जाता है। 1999-2011 से, यह "सी भाषा" थी।

  • 2011 में, सी मानक को फिर से बदल दिया गया था (आईएसओ 9899: 2011)। इस संस्करण को C11 कहा जाता है। विभिन्न नई सुविधाएँ जैसे _Generic, _Static_assertऔर थ्रेड सपोर्ट को भाषा में जोड़ा गया। अपडेट में मल्टी-कोर, मल्टी-प्रोसेसिंग और एक्सप्रेशन सीक्वेंसिंग पर बहुत ध्यान दिया गया था। 2011-2017 से, यह "सी भाषा" थी।

  • 2017 में, C11 को संशोधित किया गया था और विभिन्न दोष रिपोर्ट हल किए गए थे। इस मानक को अनौपचारिक रूप से C17 कहा जाता है और इसे ISO 9899: 2018 के रूप में जारी किया गया था। इसमें कोई नई सुविधाएँ नहीं हैं, बस सुधार हैं। यह C भाषा का वर्तमान संस्करण है।


"C99 सख्त" संभावना एक संकलक सेटिंग को संदर्भित करता है जो अक्षर द्वारा मानक का पालन करने के लिए एक संकलक को मजबूर करता है। सी मानक में कार्यान्वयन के अनुरूप एक शब्द है । अनिवार्य रूप से इसका मतलब है: "यह संकलक वास्तव में सी भाषा को सही ढंग से लागू करता है"। सी भाषा को सही ढंग से लागू करने वाले कार्यक्रमों को औपचारिक रूप से कड़ाई से अनुरूप कार्यक्रम कहा जाता है ।

"जीएनयू सी" का अर्थ दो चीजें हो सकता है। या तो सी कंपाइलर ही जो कि GNU कंपाइलर कलेक्शन (GCC) के हिस्से के रूप में आता है। या यह गैर-मानक डिफ़ॉल्ट सेटअप का मतलब हो सकता है जो जीसीसी सी कंपाइलर का उपयोग करता है। यदि आप संकलन करते हैं gcc program.cतो आप C मानक के अनुसार संकलन नहीं करते हैं, बल्कि एक गैर-मानक GNU सेटअप है, जिसे "GNU C" के रूप में संदर्भित किया जा सकता है। उदाहरण के लिए, पूरे लिनक्स कर्नेल को गैर-मानक GNU C में बनाया गया है, और मानक C में नहीं।

यदि आप अपने कार्यक्रमों को सी मानक के अनुसार संकलित करना चाहते हैं, तो आपको टाइप करना चाहिए gcc -std=c99 -pedantic-errors। यदि आपका GCC संस्करण इसका समर्थन करता है तो c99 को c11 से बदलें।


8
सख्त संकलक सेटिंग का अर्थ हो सकता है "एक्सटेंशन अक्षम करें; मानक द्वारा परिभाषित केवल सी भाषा का उपयोग करें "और साथ ही," सही ढंग से संकलित "से अधिक। भाषा को एक्सटेंशन स्वीकार करना पूरी तरह से सही है; मानक को अनुमति देने के लिए परिभाषित किया गया था।
एरिक पोस्टपिसिल

5
C94 / C95 संशोधन 1 भी था जिसमें मुख्य रूप से अधिक व्यापक चरित्र समर्थन जोड़ा गया था। C और C ++ में स्टैंडर्ड हैडर फ़ाइलों की सूची भी देखें ।
जोनाथन लेफ़लर

2
आप लिखते हैं कि C90 से C99 तक बहुत सी चीजें बदल गईं। क्या आप कुछ नाम बता सकते हैं?
मार्टिन थोमा

3
@Lundin आपने K & R के लिए गलत पुस्तक को लिंक किया; यह दूसरा संस्करण है जो C89 मानक का वर्णन करता है।
अंती हापाला

5
हाँ, लेकिन बिंदु यह है कि वह संस्करण नहीं है जिसने सी प्रोग्रामिंग भाषा को बिंदु तक परिभाषित किया है; ऐसा नहीं है कि यह कहीं भी बिक्री पर होगा।
एंटटी हापाला

7

मैं एएनएसआई सी के बारे में जवाब देना चाहता हूं। हालांकि एएनएसआई ने इसके साथ कुछ भी नहीं किया है, इसके लिए कंपाइलर अभी भी बनाए गए हैं। उदाहरण के लिए PIC XC16 कंपाइलर: "कंपाइलर पूरी तरह से मान्य कंपाइलर है जो ANSI विनिर्देश (ANSI x3.159-1989) द्वारा परिभाषित एएनएसआई सी मानक के अनुरूप है और कर्निघन और रिची की सी प्रोग्रामिंग लैंग्वेज (दूसरा संस्करण) में वर्णित है। ... "सभी प्रोग्रामिंग पीसी जैसे" बड़े "कंप्यूटरों के लिए नहीं हैं। अपने डिवाइस की लागत के लिए एक कंपाइलर लिखना, और समय और $ लागत को मान्य करना। ANSI C जीवित और अच्छी तरह से और आपके एम्बेडेड / वास्तविक समय के उपकरणों में रहता है।


4
  • ANSI C: 1989 में ANSI नामक निकाय द्वारा पहली C भाषा का मानकीकरण किया गया था, इसीलिए इसे c89 कहा जाता है।

  • C99:
    डेवलपर्स आवश्यकताओं से मांग के साथ, 1999-2000 में C99 (अतिरिक्त: इनलाइन, बूलियन ..) में अतिरिक्त कीवर्ड और सुविधाओं को शामिल किया गया है।

  • GNU C: GNU ऑपरेटिंग सिस्टम (www.gnu.org) की तरह एक यूनिक्स है और कहीं न कहीं GNU के प्रोजेक्ट को ANSI C मानक पर आधारित C ​​प्रोग्रामिंग लैंग्वेज की जरूरत है। कोड को संकलित करने के लिए GNU GCC (GNU Compiler Collection) संकलक का उपयोग करते हैं। इसमें सी लाइब्रेरी फंक्शन है जो सिस्टम कॉल को परिभाषित करता है जैसे मॉलॉक, कॉलोक, एग्जिट ... आदि

ANSI C एक मानक है जिसका उपयोग अन्य मानकों के द्वारा या रेफरी द्वारा किया जा रहा है।


C99 के बारे में कुछ भी सख्त है और क्या सी कोड कोडेक में C89 है या पहले गैर-मानकीकृत मूल C
असीम बंसल

सुधार: एएनएसआई सी एक अप्रचलित मानक है, जिसे केवल आउट-ऑफ-डेट दस्तावेजों द्वारा संदर्भित किया जाता है। सी भाषा को आईएसओ सी कहा जाता है, या यदि आप आईएसओ / आईईसी 9899: 2011 होगा।
लुंडिन

1

एडिशन टू लुंडिन उत्तर

यहाँ डेनिस रिची से जब पूछा गया कि क्या कहना है

"K & R ने फाइनल के लिए इंतजार क्यों नहीं किया, K & R 2nd संस्करण लिखने से पहले ANSI मानक को मंजूरी दी?"

K & R ने K & R 2nd संस्करण लिखने से पहले ANSI मानक को मंजूरी देते हुए अंतिम और प्रतीक्षा के लिए इंतजार क्यों नहीं किया? ऐसा लगता है कि यह पुस्तक केवल कुछ महीनों के लिए सही मानक होगी, इससे पहले कि इसे अंतिम एएनएसआई मानक द्वारा सुपरसीड किया जाएगा। मुझे पता है कि इस देर के स्तर पर कुछ बड़े बदलाव होने की संभावना है, लेकिन क्यों नहीं कुछ महीनों का इंतजार करें और सुनिश्चित करें कि आप इसे तुरंत 100% सही पाते हैं, बजाय इसके कि लगभग तुरंत एक 3 संस्करण लिखने या अप्रचलित होने की आवश्यकता है?

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

यहां तक ​​कि अगर मानक में परिवर्तन हैं, तो यह कल्पना करना मुश्किल है कि वे एक नए संस्करण को वारंट करने के लिए पर्याप्त व्यापक होंगे। (हम किसी भी तरह से नियाला के साथ सामना करने के लिए तैयार थे, अगर यह चला था।) हम भविष्य के मुद्रण में आवश्यक बदलाव करने के लिए तैयार हैं, लेकिन आशा है कि वे मामूली होने चाहिए। X3J11 के सदस्य आश्चर्यजनक लोगों के बिना समाप्त करने के लिए बहुत उत्सुक हैं, भी; उनमें से कई कंपनियों के लिए काम करते हैं जो एएनएसआई कंपाइलर तैयार कर रहे हैं, आखिरकार।

डेनिस रिची


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

@ सुपरकैट मुझे वास्तव में समझ नहीं आया कि अलियासिंग नियमों का क्या मतलब है कि क्या आप मेरी मदद कर सकते हैं?
सूरज जैन

1
मूल अवधारणा यह थी कि int i; int test(double *p) { i=1; *p=2.0; return i; }एक संकलक की तरह दिए गए कोड को बंद मौका पर iलिखने के बाद फिर से लोड करने की आवश्यकता नहीं होनी चाहिए *pजो कि pपते को रोक सकती है i। पूरी तरह से उचित है। समस्या यह है कि आधुनिक संकलक मान्यताओं को सही ठहराने के लिए एक ही नियम का उपयोग करते हैं जो एक long*को प्रभावित नहीं करता है long long, भले ही दोनों प्रकार का आकार और प्रतिनिधित्व एक ही हो , और यह कि यदि दो संरचनाएं एक सामान्य प्रारंभिक अनुक्रम साझा करती हैं, तो कोड कभी भी उपयोग नहीं करेगा। एक प्रकार का पॉइंटर जो दूसरे के माध्यम से लिखे गए CIS सदस्य को पढ़ने के लिए होता है।
सुपरकैट

-2

इस सवाल का जवाब के लिए नेट पर अच्छी तरह से नहीं खोजा गया था, वैसे भी आप इस पर गौर कर सकते हैं:

  1. C एक सामान्य प्रयोजन की प्रोग्रामिंग भाषा है जिसे शुरू में 1969 और 1973 के बीच AT & T बेल लैब्स में डेनिस रिची द्वारा विकसित किया गया था।
  2. C99 ISO द्वारा प्रकाशित C भाषा का एक मानक है और 1999 के आसपास ANSI द्वारा अपनाया गया है।
  3. GNU C केवल c89 का एक विस्तार है, जबकि c99 की कुछ विशेषताओं को भी जोड़ा जाता है, लेकिन संपूर्णता में यह c99 मानक से अलग है, इसलिए जब gcc में संकलित करना -std=c99होता है तो हमें प्रवेश करना होता है जो पहले से ही अन्य उत्तरों में उल्लिखित है।
  4. ANSI C, ANSI द्वारा जारी मानकों की क्रमिक श्रृंखला है।

मैंने अब नेट पर सर्च किया। मैंने प्रश्न संपादित किया। मुझे प्रश्न पोस्ट करने से पहले C और ANSI मानकों के बारे में पता था। मुझे विशिष्ट चीजों के बारे में भ्रम हो रहा है। मैं और अधिक सटीक होने की कोशिश करूँगा।
असेम बंसल

C99 के बारे में कुछ भी सख्त और क्या कोडेक्स में C C89 है या पहले गैर-मानकीकृत मूल C
असीम बंसल

4
इस उत्तर में कई त्रुटियां हैं। C99 1999 के आसपास ISO द्वारा परिभाषित एक मानक है। C भाषा को अंतरराष्ट्रीय स्तर पर 23 वर्षों के लिए मानकीकृत किया गया है। इस प्रकार ANSI का इससे कोई लेना- देना नहीं है, उन्होंने 24 वर्षों में C मानक को नहीं छुआ है। आजकल वे केवल अमेरिकी बाजार के लिए आईएसओ मानक का प्रिंट और वितरण करते हैं।
लुंडिन

@ लुंडिन ओह !! हाँ, वास्तव में मैंने "परिभाषित" लिखा है जो कि मामला नहीं है, इसे "अपनाया" होना चाहिए। मैंने इसमें सुधार किया, एएनएसआई ने 1989 में सी रास्ते के लिए पहला पहला मानक जारी किया, जिसे आईएसओ द्वारा अपनाया गया था। इसके बाद लगभग सभी मानक आईएसओ द्वारा जारी किया गया था और एएनएसआई द्वारा अपनाया गया था, और उत्तर संक्षिप्त रूप में पूछा जा रहा है, इसलिए मैंने उत्तर को छोटा रखते हुए कुछ चीजों का उल्लेख किया।
डेसीमल 0

1
ध्यान दें कि gccसमर्थन करता है -std=c89और -std=gnu89और -std=c99और -std=gnu99(और काफी आधुनिक संस्करण का समर्थन -std=c11और -std=gnu11)। अंतर मानक सी पर एक्सटेंशन के साथ स्वचालित रूप से या केवल तभी उपलब्ध होता है जब स्रोत कंपाइलर को उचित मैक्रोज़ (जैसे कि -D_XOPEN_SOURCE=700) प्रदान करने में सक्षम करता है ।
जोनाथन लेफ़लर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.