हर कोई मानक C प्रकार से अधिक क्यों टाइप करता है?


103

यदि आप क्यूटी का उपयोग करना चाहते हैं , तो आपको गले लगाना होगा quint8, quint16और इसके बाद।

यदि आप GLib का उपयोग करना चाहते हैं , तो आपको स्वागत करना होगा guint8, guint16और इसके बाद।

पर लिनक्स देखते हैं u32, s16इसके आगे और।

uC / OS परिभाषित करता है SINT32, UINT16और आगे।

और अगर आपको उन चीजों के कुछ संयोजन का उपयोग करना है, तो आप बेहतर रूप से परेशानी के लिए तैयार रहेंगे। पर क्योंकि आपके मशीन u32जाएगा typedefअधिक d longऔर quint32हो जाएगा typedefसे अधिक d intऔर संकलक शिकायत

अगर ऐसा है तो हर कोई ऐसा क्यों करता है <stdint.h>? क्या पुस्तकालयों के लिए यह किसी प्रकार की परंपरा है?


8
@ माइक्रोड्रोलर प्रोग्रामिंग में मेहरदाद आपके पास सभी प्रकार की चीजें हो सकती हैं। AVR मेगा के उदाहरण के लिए (और फलस्वरूप प्रसिद्ध Arduino पर) int 16 बिट है। यह एक बुरा आश्चर्य हो सकता है। मेरी राय में, 'अहस्ताक्षरित लघु' को अधिक टाइपिंग प्रयास की आवश्यकता होती है। और इसने मुझे हमेशा <s> बाइट के लिए 'अहस्ताक्षरित चार' का उपयोग करके दुखी किया। निरुपित चरित्र, वास्तव में?
अमूमन

2
@ मेहरदाद बिंदु यह है कि आप वास्तव में निश्चित नहीं हो सकते। ठीक यही कारण है कि stdint.hआविष्कार किया गया था।
ग्लोगल

1
@glglgl: यहाँ समस्या को देखने का एक और तरीका है: क्या आप सही गलत सवाल नहीं पूछ रहे हैं? यदि आप कई प्रणालियों को लक्षित कर रहे हैं, तो मनमाने ढंग से कोड में बिट्स की संख्या को हार्ड-कोड क्यों करें? यानी, केवल sizeof(int) * CHAR_BITउदाहरण के लिए (उदाहरण के लिए) और उसका उपयोग क्यों नहीं किया ? यदि आपकी intसीमा का प्रतिनिधित्व करने के लिए आपका आकार बहुत छोटा है (उदाहरण के लिए एक इंडेक्स इंडेक्स), तो आप लगभग निश्चित रूप से intवैसे भी उपयोग नहीं करना चाहिए , लेकिन ऐसा कुछ size_tint32कोई और समझ क्यों करेगा ? केवल समय निश्चित चौड़ाई से समझ में आता है कि सिस्टम के बीच संचार के लिए है (जैसे फ़ाइल / नेटवर्क प्रारूप) ...
user541686

1
@ मेहरदाद नं। कभी-कभी मेरे पास मूल्य होते हैं (जैसे कि एक एडीसी या जो कुछ भी) जिसे मुझे स्टोर करने की आवश्यकता है। मुझे पता है कि वे 16 बिट चौड़े हैं। तो उपयोग करने के लिए सबसे अच्छा टिंग है uint16_t(या शायद इसका fastया leastवैरिएंट)। मेरा कहना है: ये प्रकार उपयोग करने के लिए सुविधाजनक हैं और इनके अस्तित्व का कारण है।
ग्लोगल

1
@ मेहरदाद: मेरा सुझाव है कि - यह मानते हुए कि गुणवत्ता कोड का उत्पादन करने के आपके प्रयास के लायक है - आपको अपने स्वयं के कार्यात्मक टाइपफेड को परिभाषित करना चाहिए, मेरे एपीआई / मेरे बाकी कोड के साथ बातचीत करने का तरीका , और तकनीकी आधार पर इन्हें तकनीकी आधार पर परिभाषित करना चाहिए। "तकनीकी" टाइपसेफ की तरह size_tऔर / या uint64_t
PJTraill

जवाबों:


80

stdint.hजब इन पुस्तकालयों को विकसित किया जा रहा था तो वापस मौजूद नहीं था। इसलिए प्रत्येक पुस्तकालय ने अपना स्वयं का बनाया typedef


4
और ठीक है, मुझे लगता है कि stdint की कमी है। यह एक अच्छा कारण है, लेकिन आज भी ये टाइपराइफ अंत में, लंबे और इतने अधिक क्यों हैं और स्टीडिंट प्रकारों पर नहीं? यह उन्हें विनिमेय कम से कम बना देगा
अमूमन

25
@Amomum "क्यों ग्लिब (जो लिनक्स पर विकसित किया गया था) लिनक्स टाइपफेड का उपयोग नहीं किया?" जबकि ग्लिब का "होम बेस" निश्चित रूप से लिनक्स है, यह निश्चित रूप से एक पोर्टेबल लाइब्रेरी डिज़ाइन करके है। अपने स्वयं के प्रकारों को परिभाषित करने से पोर्टेबिलिटी सुनिश्चित होती है: केवल एक छोटे हेडर को अनुकूलित करना होता है जो लाइब्रेरी प्रकारों से संबंधित उचित लक्ष्य प्लेटफ़ॉर्म प्रकारों से मेल खाता है।
पीटर -

3
@Amomum क्यों Glib (यह लिनक्स पर विकसित किया गया था) ... नहीं, यह नहीं था। लिनक्स कर्नेल से पहले ग्लिब को रास्ता बनाया गया था ।
andy256

5
@ @y256 "ग्लिब" के लिए "ग्लिब" कम नहीं है। यह एक पुस्तकालय है जो gtk से दूर है। यह लिनक्स से पुराना नहीं है।

2
@ @ and256: glib 1998 है, linux 1991 है। IOW, GLib को लिनक्स के बाद बनाया गया था ।
MSALERS

40

पुराने पुस्तकालयों के लिए, यह आवश्यक है क्योंकि प्रश्न में हेडर stdint.hमौजूद नहीं है।

हालांकि, अभी भी एक समस्या है: उन प्रकार ( uint64_tऔर अन्य) मानक में एक वैकल्पिक विशेषता हैं । इसलिए एक अनुपालन कार्यान्वयन उनके साथ जहाज नहीं कर सकता है - और इस तरह पुस्तकालयों को मजबूर करने के लिए उन्हें आजकल भी शामिल किया गया है।


14
uintN_tप्रकार के वैकल्पिक हैं, लेकिन uint_leastN_tऔर uint_fastN_tप्रकार के नहीं हैं।
कुसलानंद

7
@ कुसलानंद: दुख की बात यह है कि सीमित उपयोगिता वाले हैं।
ऑर्बिट

16
पाठ्यक्रम कारण यह है कि वे वैकल्पिक हैं की है कि आप की गारंटी नहीं है वहाँ वह यह है कि कर रहे हैं बिट्स के वास्तव में है कि संख्या के साथ प्रकार पूर्णांक। C अभी भी अजीब पूर्णांक आकार के साथ आर्किटेक्चर का समर्थन करता है।
celtschk

5
@LightnessRacesinOrbit: वे सीमित उपयोगिता के कैसे हैं? मुझे यह स्वीकार करना चाहिए कि हार्डवेयर इंटरफेस के अलावा, मैं यह नहीं देखता कि आपको अपने सभी मूल्यों को सुनिश्चित करने के लिए केवल न्यूनतम के बजाय बिट्स की एक सटीक संख्या की आवश्यकता क्यों होगी।
celtschk

23
@Amomum टाइपफैड की आवश्यकता होती है यदि कार्यान्वयन में आवश्यकताओं को पूरा करने के प्रकार होते हैं: "हालांकि, यदि कार्यान्वयन 8, 16, 32 या 64 बिट्स की चौड़ाई के साथ पूर्णांक प्रकार प्रदान करता है, कोई पैडिंग बिट्स नहीं है, और हस्ताक्षरित प्रकारों के लिए जो हैं एक दो का पूरक प्रतिनिधित्व, यह इसी टाइप किए गए नाम को परिभाषित करेगा। " (N1570 से उद्धरण, 7.20.1.1 "सटीक-चौड़ाई पूर्णांक प्रकार") तो अगर मानक पुस्तकालय उनके पास नहीं है, तो एक तृतीय-पक्ष पुस्तकालय भी नहीं कर सकता है, ऐसा लगता है।
एरिक एम श्मिट

13

stdint.h 1999 से मानकीकृत किया गया है। यह अधिक संभावना है कि कई अनुप्रयोगों को परिभाषित (प्रभावी रूप से उर्फ) प्रकार अंतर्निहित मशीन वास्तुकला से आंशिक स्वतंत्रता बनाए रखने के लिए है।

वे डेवलपर्स को विश्वास प्रदान करते हैं कि उनके आवेदन में उपयोग किए गए प्रकार व्यवहार पर उनकी परियोजना की विशिष्ट मान्यताओं से मेल खाते हैं जो भाषा मानक या संकलक कार्यान्वयन से मेल नहीं खाते हैं।

इस अभ्यास को ऑब्जेक्ट ओरिएंटेड फ़ेकडे डिज़ाइन पैटर्न में दिखाया गया है और डेवलपर्स द्वारा सभी आयातित पुस्तकालयों के लिए रैपर क्लास लिखने के लिए बहुत अधिक दुर्व्यवहार किया जाता है।

जब कम्पेलर्स बहुत कम मानक थे और मशीन आर्किटेक्चर 16-बिट, 18-बिट से 36-बिट वर्ड लेंथ मेनफ्रेम के माध्यम से भिन्न हो सकते हैं, तो यह एक विचार के बहुत अधिक था। 32-बिट एआरएम एम्बेडेड सिस्टम में परिवर्तित होने वाली दुनिया में अब यह प्रथा बहुत कम प्रासंगिक है। यह विषम मेमोरी मैप वाले कम-अंत माइक्रोकंट्रोलर्स के लिए चिंता का विषय है ।


1
दी गई, stdint.h1999 से इसे मानकीकृत किया गया है, लेकिन व्यवहार में यह कब तक उपलब्ध है? लोग अपने पैरों को लागू करने और नए मानकों को अपनाने के लिए खींचते हैं, और उस लंबी संक्रमणकालीन अवधि के दौरान, पुराने तरीके अभी भी एक हैं।
सियुआन रेन

1
इसके साथ एक गंदा गोथा stdint.hयह भी है कि प्लेटफ़ॉर्म पर भी जहाँ उदाहरण के लिए longऔर int32_tसमान आकार और प्रतिनिधित्व है, वहाँ कोई आवश्यकता नहीं है कि एक कास्टिंग int32_t*करने के long*लिए एक सूचक है कि मज़बूती से एक का उपयोग कर सकते हैं उपज है int32_t। मैं मानक के लेखकों पर विश्वास नहीं कर सकता था, यह स्पष्ट था कि लेआउट-संगत प्रकार उर्फ-संगत होना चाहिए, लेकिन चूंकि उन्होंने यह कहते हुए परेशान नहीं किया कि इसलिए gcc और IIRC क्लैंग के लेखकों को लगता है कि भाषा को अन्यताओं की अनदेखी करके भी सुधार किया जाएगा। ऐसे मामलों में जहां यह स्पष्ट है।
सुपरकैट

2
@ सुपरकैट - वह शायद सी कमेटी को एक इरेटम के रूप में प्रस्तुत करने के लायक है ... क्योंकि वह
कृतज्ञतापूर्वक

@LThode: सी कमेटी के लिए यह स्वीकार करना कि एक गलती के रूप में यह आवश्यक होगा कि वह आधिकारिक तौर पर क्लैंग और जीसीसी के व्यवहार को ओछेपन के रूप में घोषित करे। क्या आपको लगता है कि ऐसा होने वाला है? सबसे अच्छा है कि (और IMHO आगे बढ़ने के लिए तार्किक तरीका) के लिए उम्मीद की जा सकती है "प्रोग्राम मोड" को निर्दिष्ट करने के लिए कार्यक्रमों के तरीके को परिभाषित करना होगा। यदि कोई प्रोग्राम कहता है कि यह बहुत सख्त अलियासिंग नियमों को स्वीकार कर सकता है, तो एक कंपाइलर इसका उपयोग कर सकता है जो कि अनुकूलन से परे अनुकूलन की अनुमति दे सकता है। यदि कोई प्रोग्राम निर्दिष्ट करता है कि उसे ऐसे नियमों की आवश्यकता है जो वर्तमान लोगों की तुलना में कुछ अधिक प्रोग्रामर-फ्रेंडली हों ...
Supercat

... लेकिन फिर भी कई उपयोगी अनुकूलन की अनुमति देगा, तब एक संकलक कोड उत्पन्न कर सकता है जो कि बहुत अधिक कुशल था जितना संभव होगा -fno-strict-alias, लेकिन जो अभी भी वास्तव में काम करेगा। यहां तक ​​कि अगर कोई मौजूदा कोड आधार नहीं था, तो नियमों का कोई भी सेट सभी अनुप्रयोगों के लिए अनुकूलन और शब्दार्थों के इष्टतम संतुलन को प्रभावित नहीं कर सकता है, क्योंकि विभिन्न अनुप्रयोगों की अलग-अलग आवश्यकताएं हैं। मौजूदा कोडबेस में जोड़ें और विभिन्न मोड्स की आवश्यकता स्पष्ट होनी चाहिए।
सुपरकैट

3

तो आप int करने के लिए typedef char करने की शक्ति रखते हैं।

एक "कोडिंग हॉरर" ने उल्लेख किया कि एक कंपनियों के हेडर में एक बिंदु था जहां एक प्रोग्रामर एक बूलियन मूल्य चाहता था, और एक चार्ट नौकरी के लिए तार्किक मूल प्रकार था, और इसलिए लिखा गया था typedef bool char। फिर बाद में किसी ने पूर्णांक को सबसे तार्किक विकल्प पाया, और लिखा typedef bool int। परिणाम, यूनिकोड से पहले की आयु, वस्तुतः थी typedef char int

काफी आगे की सोच, आगे की अनुकूलता, मुझे लगता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.