C99 में सबसे उपयोगी नई विशेषताएँ क्या हैं? [बन्द है]


78

C99 लगभग 10 वर्षों से अधिक समय से है, लेकिन इसके लिए समर्थन धीमी गति से आ रहा है, इसलिए अधिकांश डेवलपर्स C89 के साथ फंस गए हैं। आज भी, जब मैं C कोड में C99 फीचर भरता हूं तो मुझे कभी-कभी हल्का आश्चर्य होता है।

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

आपको C99 में सबसे उपयोगी नई सुविधाएँ क्या लगती हैं?

संदर्भ के लिए, C99 मानक (ड्राफ्ट के रूप में लेबल किया गया है, लेकिन अद्यतन मानक के समान है, जहां तक ​​मुझे पता है), नई सुविधाओं की सूची और GCC C99 कार्यान्वयन स्थिति

प्रति उत्तर में एक सुविधा, कृपया; कई उत्तर छोड़ने के लिए स्वतंत्र महसूस करें। नई सुविधाओं को प्रदर्शित करने वाले लघु कोड उदाहरणों को प्रोत्साहित किया जाता है।


2
सुविधाओं के लिए एक समान विकी होना चाहिए जो लोग C99 में नफरत करते हैं !
आलोक सिंघल

खैर, हानिकारक या असमर्थित C99 सुविधाओं के बारे में एक सवाल था stackoverflow.com/questions/1898890/…
ब्रायन कैंपबेल

धन्यवाद। आपको यह दिखाने के लिए लिंक टेक्स्ट को बदलना चाहिए कि यह एक ड्राफ्ट है, वास्तविक मानक नहीं है, और जब आप इसके साथ हों तो n1256 से लिंक करें। BTW, gcc.gnu.org/c99status.html को देखते हुए , मैं नहीं कहूंगा कि अधिकांश C99 gcc द्वारा समर्थित है। और चूंकि जीसीसी सबसे व्यापक रूप से प्रयुक्त सी कंपाइलरों में से एक है, ...
आलोक सिंघल

2
ध्यान दें कि एम्बेडेड प्रोसेसर क्षेत्र में, C99 अभी भी अच्छी तरह से समर्थित नहीं हो सकता है।
क्रेग मैकक्वीन

1
@ आलोक मैं उस स्तर के समर्थन को सबसे अधिक सुविधाएँ कहूँगा; मुझे लगता है कि यह इस बात पर निर्भर करता है कि आप इसे कैसे परिभाषित करते हैं, लेकिन मुझे लगता है कि अधिकांश महत्वपूर्ण विशेषताएं जो लोग उपयोग करना चाहते हैं, वे कुछ पुस्तकालय मुद्दों को छोड़कर, समर्थित हैं। @ क्रेग फेयर काफी, एम्बेडेड संकलक के बारे में एक अस्वीकरण जोड़ा।
ब्रायन कैंपबेल

जवाबों:


77

मुझे टाइप करने की आदत है

C ++ में यह एक गैर- C99 कंपाइलर का उपयोग करने के लिए एक दर्द है जहां मुझे कहने के लिए मजबूर किया जाता है


44
इसके अलावा, यह int वैरिएबल के दायरे को
बताता

यही मेरी पिक होगी।
13

2
@ ओलिवर <कटाक्ष> लेकिन फिर निर्देश sub esp, 4और add esp, 4हटा दिए जाते हैं! </ कटाक्ष>
कोल जॉनसन

72

stdint.h, जो परिभाषित करता है int8_t, uint8_tआदि। आपके पूर्णांक कितने व्यापक हैं, इसके बारे में गैर-पोर्टेबल धारणाएं बनाने के लिए और अधिक नहीं।


19
DE: AD: BE: EF: CA: FE के बाद से सर्वश्रेष्ठ हेक्स वाक्यांश।
केविन एल।

डेकाबाद का क्या मतलब है?
पचेरियर

5
@Pacerier यह केवल उदाहरण के उदाहरण के लिए इस्तेमाल की जाने वाली एक मनमानी हेक्साडेसिमल स्थिरांक है। लेकिन हास्य मूल्य के लिए, यह "डिकैफ़्ड बैड" मंत्र है, जिसका अर्थ है कि डिकैफ़िनेटेड कॉफ़ी वास्तविक चीज़ से नीच है।
ब्रायन कैंपबेल

5
ठीक है, मैं उनके हास्य से संबंधित नहीं कर सकता ...
तेजस्वी

66

मुझे लगता है कि नए आरंभीकरण तंत्र अत्यंत महत्वपूर्ण हैं।

ठीक है - एक सम्मोहक उदाहरण नहीं है, लेकिन संकेतन सटीक है। आप किसी सरणी के विशिष्ट तत्वों और किसी संरचना के विशिष्ट सदस्यों को प्रारंभ कर सकते हैं।

शायद एक बेहतर उदाहरण यह होगा - हालांकि मैं मानता हूँ कि यह बहुत सम्मोहक नहीं है:


6
यह एक आकर्षक प्रदर्शन है। वहाँ समान स्ट्रिंग-तालिकाओं के साथ भारी मात्रा में एनम-टेबल हैं।
u0b34a0f6ae

5
@ColeJohnson: यदि आप दूसरे उदाहरण को ध्यान से देखते हैं, तो आप देखेंगे कि इनिशियलाइज़र्स ऑर्डर से बाहर सूचीबद्ध हैं - लेकिन सही तरीके से काम करेंगे। यह केवल परिभाषित के साथ नहीं किया जा सकता है। पहला उदाहरण सरणी के केवल सूचकांक 4 को आरंभ करता है; यह केवल परिभाषित के साथ नहीं किया जा सकता है, या तो।
जोनाथन लेफ़लर

2
यह भी ध्यान दिया जाना चाहिए कि एक ही सूचकांक का एक से अधिक बार उपयोग करने से पहला उपयोग दूसरे के साथ ओवरराइड करेगा - मेरा प्रश्न यहां देखें, उदाहरण के लिए: stackoverflow.com/questions/16742467/…
जॉनी

51

चर लंबाई सरणियों:


3
तुम सच में लगता है कि VLA सरणियों महान हैं? C11 उन्हें वैकल्पिक बनाता है।
Z बोसॉन

3
स्टैक ओवरफ़्लो (या स्टैक भ्रष्टाचार, यदि एक्स नकारात्मक है) को रोकने के लिए इनपुट स्वच्छता लागू करने के लिए मत भूलना:if (x < 0) x = 0; else if (x > 1024) x = 1024;
एंड्रयू D'Addesio

51

शुरुआत के साथ एक-लाइन टिप्पणियों के लिए समर्थन //


7
+1 सभी संकलक मुझे पता है कि यह पहले से ही इसका समर्थन करता है। यह मानक में उल्लिखित समय के बारे में है।
स्लीबटमैन

41

एक ब्लॉक की शुरुआत के अलावा अन्य स्थानों पर चर घोषित करने में सक्षम होने के नाते।


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

5
आप @supercat पसंद करते हैं int a; int b; a = f(); b = g();करने के लिए int a = f(); int b = g();? त्रुटियों को कम करने के लिए यह आरम्भिक चर घोषित करता है, जहाँ यह आरंभ हो जाता है।
रयान हेनिंग

@RyanHaining: वैकल्पिक रूप से, एक नेस्टेड स्कोप ब्लॉक बनाएं (मैं बस एक मानक सिंटैक्स चाहता था जिसमें कहा गया था कि "यह ब्लॉक केवल स्कूपिंग के लिए है"; कोई भी उस उद्देश्य के लिए आसानी से अशक्त मैक्रो का उपयोग कर सकता है, लेकिन यह थोड़ा बदसूरत लगता है।
सुपरकैट

@supercat इसके लिए एक मानक वाक्यविन्यास है: /* this block is just for scoping */ { } /* scope */:)
alx

@CacahueteFrito: मुझे लगता if(1) /* Scoping block */ { }है कि यह थोड़ा बेहतर है, लेकिन एक बड़ा मुद्दा यह है कि स्कूपिंग और नियंत्रण ऑर्थोगोनल अवधारणाएं हैं। हालांकि कई बार ऐसा होता है जब यह चीजों को लूप के दायरे में लाने की कोशिश करता है, लेकिन लूप के चारों ओर बिखरी हुई चीजों को रखने के लिए यह अक्सर उपयोगी होता है, और कई बार ऐसा भी होता है जब कोड ऑब्जेक्ट को वैल्यू बनाए रखने के लिए बनाएंगे जिनकी जरूरत सृजन में होगी लंबे समय तक जीवित वस्तुओं, लेकिन उसके बाद कभी नहीं (उदाहरण के लिए float dx=x2-x1, dy=y2-y1; float distance = sqrt(dx*dx+dy*dy);। कोई कारण नहीं है कि dx और
डाई

36

वारीडिक मैक्रो। असीमित संख्या में तर्कों के साथ बॉयलरप्लेट कोड उत्पन्न करना आसान बनाता है।


34

snprintf() - गंभीरता से, यह सुरक्षित स्वरूपित तारों को करने में सक्षम होने के लिए बहुत लायक है।


1
सच सच। मैं खुद इस जवाब को जोड़ने जा रहा था अगर किसी और ने नहीं किया।
ब्रायन कैंपबेल

29

यौगिक शाब्दिक। सदस्य-दर-संरचना सेट करना '89 है;)

आप अनावश्यक चर घोषित किए बिना स्वचालित भंडारण अवधि वाली वस्तुओं के लिए संकेत प्राप्त करने के लिए उनका उपयोग भी कर सकते हैं, जैसे

की वृत्ति


यह 4 सही के लिए स्टैक पर मेमोरी आवंटित करना चाहिए?
अल्फागोकू

29

लचीले सरणी के सदस्य।

६..२.१ संरचना और संघ के नमूने .1 ers

एक विशेष मामले के रूप में, एक से अधिक नामित सदस्य के साथ संरचना का अंतिम तत्व एक अपूर्ण सरणी प्रकार हो सकता है; इसे ए कहा जाता है एक्सिबल एरे मेंबर । दो अपवादों के साथ, ible बाहरी सरणी सदस्य को नजरअंदाज कर दिया जाता है। सबसे पहले, संरचना का आकार एक अन्यथा समान संरचना के अंतिम तत्व की ऑफसेट के बराबर होगा जो with exible सरणी के सदस्य को unspeci ible ed लंबाई के एक सरणी के साथ बदलता है) दूसरा, जब एक. (या)->) ऑपरेटर का एक बायाँ ऑपरेंड होता है, जो (एक पॉइंटर) एक संरचना है जिसमें array एक्सिबल एरे मेंबर होता है और उस ऑपेरेंट का नाम उस सदस्य के लिए होता है, ऐसा व्यवहार करता है जैसे कि उस सदस्य को सबसे लंबे एरे (उसी एलिमेंट टाइप के साथ) से बदला गया हो ऑब्जेक्ट को एक्सेस करने से बड़ा स्ट्रक्चर बनाना; सरणी की ऑफसेट that exible array सदस्य की रहेगी, भले ही यह प्रतिस्थापन सरणी से भिन्न हो। यदि इस सरणी में कोई तत्व नहीं है, तो यह व्यवहार करता है जैसे कि इसमें एक तत्व था लेकिन व्यवहार would ned है यदि कोई भी उस तत्व तक पहुंचने का प्रयास करता है या एक पॉइंटर को उत्पन्न करने के लिए।

उदाहरण:


2
इस कोषेर को बनाने के लिए +1। यह हर टीसीपी / आईपी सॉकेट कोड में है जिसे मैंने कभी देखा है।
स्लीपबेटमैन

वास्तव में, मैं इसे बुफ़ [1] का उपयोग करने और मालॉक आकार से 1 को घटाने की सामान्य चाल की तुलना में कहीं अधिक कोषेर मानूंगा। चाल आम हो सकती है, लेकिन मैं इसे अपरिभाषित व्यवहार के रूप में मानूंगा (उचित उपयोग buf [MAX_SIZE] और मल्को साइज़ से MAX_SIZE घटाना होगा) क्योंकि संकलक का उत्पन्न अनुक्रमण कोड कोड buf [] के कथित आकार पर निर्भर कर सकता है।
सुपरकैट

25

बूल प्रकार।

अब आप ऐसा कुछ कर सकते हैं:

छप जाएगा


2
जो कोई भी इस बारे में सोचा है वह शुद्ध है
L thoughto̲̳̳n̲̳̳g̲̳p̲̳̳o̲̳̳k̲̳̳e̲̳̳

नहीं, boolC99 में चर को दिए गए मान को हमेशा 1 या 0. किया जाता है, इसीलिए अगर आपको C99 कंपाइलर और "सिम्युलेटेड" boolप्रकार के साथ पुराने वाले कोड पर चलने वाला कोड है तो आपको केयरफुल होना होगा । उपयोग !!करने से वह पोर्टेबल हो जाएगा। v = !!5;एक ही शब्दार्थ है, लेकिन उतना पठनीय नहीं है।
पैट्रिक श्ल्टर 11

क्या यह 6 की तरह सम संख्या प्रदान करते समय 1 प्रिंट करेगा?
फुल्विक

हाँ। किसी भी गैर शून्य मूल्य wil को
1.20

18

inlineकार्यों के लिए समर्थन ।


व्यवहार में, जीसीसी आमतौर पर इनलाइन कीवर्ड को अनदेखा करता है, जो तय करता है कि कौन सा इनलाइन कार्य करता है, और स्वचालित रूप से अपने स्वयं के आंकड़ों के आधार पर चीजों को इनलाइन करता है जब तक कि आप इसे अन्यथा करने के लिए मजबूर न करें।
डेफ

7
daf: फिर inlineभी मदद करता है, क्योंकि यह आपको फ़ंक्शन को एक से अधिक अनुवाद इकाई में परिभाषित करने की अनुमति देता है - इसलिए आप इसे हेडर फ़ाइल में रख सकते हैं, जिससे क्रॉस-मॉड्यूल इनलाइनिंग अवसर मिलते हैं।
कैफे

@ डैफinline __attribute__((force_inline))
कोल जॉनसन

18

यौगिक शाब्दिक, पहले से ही उल्लेख किया है, लेकिन यहाँ मेरे सम्मोहक उदाहरण है:

यह ढेर पर होने पर भी डेटा को इनिशियलाइज़ करने का एक स्पष्ट तरीका है। किसी चीज़ को ज़ीरो इनिशियलाइज़ करना नहीं भूलना है।



15

यूनिकोड एस्केप अनुक्रम समर्थन:

या फिर, शाब्दिक यूनिकोड वर्ण:

(ध्यान दें: आपके स्थान के आधार पर काम नहीं कर सकता है, विभिन्न एन्कोडिंग के लिए पोर्टेबल समर्थन इस से अधिक काम लेगा)


12

हेक्साडेसिमल फ़्लोटिंग पॉइंट कॉन्स्टेंट्स ( 0x1.8p0f) और रूपांतरण विनिर्देशक ( %a,%A )। यदि आप अक्सर निम्न-स्तरीय संख्यात्मक विवरणों से निपटते हैं, तो ये दशमलव शाब्दिक और रूपांतरणों पर एक बहुत बड़ा सुधार हैं।

वे आपको एल्गोरिथ्म के लिए स्थिरांक निर्दिष्ट करते समय गोलाई के बारे में चिंताओं से बचाते हैं, और निम्न-स्तर फ़्लोटिंग-पॉइंट कोड डीबग करने के लिए बेहद उपयोगी होते हैं।


3
हां, मैंने दूसरे दिन इनका इस्तेमाल किया जब किसी को यह समझाने की कोशिश की गई कि फ्लोटिंग पॉइंट नंबर दूसरे स्टैक ओवरफ्लो प्रश्न में कैसे काम करते हैं।
ब्रायन कैंपबेल

9

व्यक्तिगत रूप से, मुझे आईईसी 60559: 1989 की पावती पसंद है (माइक्रोप्रोसेसर सिस्टम के लिए बाइनरी फ्लोटिंग-पॉइंट अंकगणित) और बहुत बेहतर फ्लोटिंग-पॉइंट समर्थन।

एक समान नस में, फ़्लोटिंग-पॉइंट राउंडिंग मोड को सेट करना और क्वेरी करना, नेन / इन्फिनिटी / सबनॉर्मल नंबरों आदि की जांच करना, बहुत अच्छा है।


ठीक है, एमएस ऐसा करना पसंद नहीं करता है
कोल जॉनसन

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