c++ - what - द सी++ प्रोग्रामिंग लैंग्वेज




क्या size_t हमेशा अहस्ताक्षरित है? (4)

1999 आईएसओ सी मानक (C99) के अनुसार, size_t कम से कम 16 बिट का एक अहस्ताक्षरित पूर्णांक प्रकार है (देखें खंड 7.17 और 7.18.3)।

मानक यह भी सलाह देता है कि size_t यदि संभव हो तो एक पूर्णांक रूपांतरण रैंक अधिक से अधिक नहीं होना चाहिए, अर्थात यदि unsigned long करने के लिए size_t को कास्टिंग करना अपरिहार्य है, तो अनुशंसा का पालन किया जाता है।

1989 एएनएसआई सी मानक (एएनएसआई सी) न्यूनतम आकार या अनुशंसित रूपांतरण रैंक का उल्लेख नहीं करता है।

1998 आईएसओ सी ++ मानक (सी ++ 98) (साथ ही सी ++ 0x के लिए वर्तमान मसौदा) सी मानक को संदर्भित करता है। धारा 18.1 में लिखा है:

सामग्री मानक C लाइब्रेरी हेडर <stddef.h> [...] के समान हैं

खंड 1.2 के अनुसार, इसका मतलब है कि 1990 आईएसओ सी मानक (C90) द्वारा परिभाषित पुस्तकालय, 1995 से इसका पहला संशोधन सहित (C95):

ISO / IEC 9899: 1990 के क्लाज 7 और ISO / IEC 9899 / Amd.1: 1995 के क्लॉज 7 में वर्णित लाइब्रेरी को इसके बाद मानक C लाइब्रेरी कहा जाता है।

size_t बारे में भागों को एएनएसआई सी से विरासत में लिया जाना चाहिए: फ्रंटमैटर और सेक्शन नंबर एक तरफ, सी 90 और एएनएसआई सी के लिए मानक समान हैं। मुझे यह सुनिश्चित करने के लिए मानक संशोधन की एक प्रति की आवश्यकता होगी जो यह सुनिश्चित करें कि stddef.h लिए कोई प्रासंगिक परिवर्तन नहीं थे, लेकिन मुझे संदेह है। न्यूनतम आकार stdint.h साथ पेश किया जा रहा है, यानी C99।

कृपया C ++ 98 के खंड 1.2 से निम्नलिखित उद्धरण पर भी विचार करें:

सभी मानक पुनरीक्षण के अधीन हैं, और इस अंतर्राष्ट्रीय मानक पर आधारित समझौतों के लिए पार्टियों को नीचे दिए गए मानकों के सबसे हाल के संस्करणों को लागू करने की संभावना की जांच करने के लिए प्रोत्साहित किया जाता है।

शीर्षक के रूप में: size_t हमेशा अहस्ताक्षरित होता है, अर्थात size_t x , x हमेशा >= 0 ?


Size_t को C मानक के समान परिभाषा का पालन करना चाहिए, और C ++ मानक में कई स्थानों पर इसका अर्थ यह है कि यह अहस्ताक्षरित नटुरा है (विशेषकर आवंटन टेम्पलेट तर्क परिभाषाओं में)।

सी ++ मानक पर, धारा 18.1 (आईएसओ / आईईसी 14882 - पहला संस्करण 1998-01-01):

तालिका 15 को परिभाषित प्रकारों के रूप में सूचीबद्ध किया गया है: ptrdiff_t और size_t

3 सामग्री निम्न परिवर्तनों के साथ मानक C लाइब्रेरी शीर्षलेख के समान है: 4 मैक्रो NULL इस अंतर्राष्ट्रीय मानक (4.10) में एक कार्यान्वयन-परिभाषित C ++ null सूचक स्थिरांक है।

मैक्रो ऑफसेटऑफ इस अंतर्राष्ट्रीय मानक में सीमित तर्कों के एक सीमित सेट को स्वीकार करता है। प्रकार एक POD संरचना या POD संघ (खण्ड 9) होगा। एक स्थैतिक डेटा सदस्य या एक फ़ंक्शन सदस्य अपरिभाषित है जो किसी फ़ील्ड में ऑफ़सेट मैक्रो को लागू करने का परिणाम है। देखें: उप-खंड 5.3.3, साइज़ोफ़, उप-खंड 5.7, एडिटिव ऑपरेटर, उप-खंड 12.5, फ्री स्टोर, और आईएसओ सी उप-खंड 7.1.6।


मानक के अनुसार यह अहस्ताक्षरित है, हालाँकि मुझे याद है कि कुछ पुराने कार्यान्वयनों में टाइपराइफ़ के लिए हस्ताक्षरित प्रकार का उपयोग किया गया था।

पुराने जीसीसी डॉक से:

2.4 जारी करने से पहले GCC के size_t प्रकार और संस्करणों के साथ एक संभावित समस्या है। ANSI C के लिए आवश्यक है कि size_t हमेशा एक अहस्ताक्षरित प्रकार का हो। मौजूदा सिस्टम की हेडर फ़ाइलों के साथ संगतता के लिए, जीसीसी stddef.h में size_t को परिभाषित करता है जो कि सिस्टम के sys/types.h को sys/types.h करता है। अधिकांश यूनिक्स सिस्टम जो sys/types.h को sys/types.h में परिभाषित करते हैं, इसे एक हस्ताक्षरित प्रकार sys/types.h । पुस्तकालय में कुछ कोड size_t पर एक अहस्ताक्षरित प्रकार होने पर निर्भर करता है, और यदि यह हस्ताक्षरित है तो सही ढंग से काम नहीं करेगा

मुझे यकीन नहीं है कि उसके खिलाफ रक्षा करना कितना महत्वपूर्ण होगा। मेरा कोड मानता है कि यह अहस्ताक्षरित है।


हां, size_t को एक अहस्ताक्षरित प्रकार होने की गारंटी है।





standards