2009-07-06 13 views
53

शीर्षक के रूप में: size_t हमेशा हस्ताक्षरित है, यानी size_t x के लिए, x हमेशा >= 0 है?आकार_टी हमेशा हस्ताक्षरित है?

+4

नीचे दिए गए सभी दावों के लिए मानकों के दस्तावेज़ से कुछ उद्धरण अच्छा होगा। –

+4

यह आकार के बारे में नहीं है, इस तरह आप इसका उपयोग करते हैं :) – ralphtheninja

+8

"हस्ताक्षरित आकार_टी" के लिए "ssize_t" है :) –

उत्तर

44

हाँ

typedef unsigned int size_t; 

संदर्भ::

सी ++ स्टैंडर्ड धारा 18.1 को परिभाषित करता है size_t<cstddef> जो <stddef.h> के रूप में सी स्टैंडर्ड में वर्णन किया गया है यह आमतौर पर निम्नलिखित (32-बिट सिस्टम) की तरह कुछ के रूप में परिभाषित।
सी स्टैंडर्ड धारा 4.1.5 sizeof ऑपरेटर

+0

@Neil: मुझे पता है। यह पहली बात थी जो मैंने पाया था। मेरे पास सी ++ मानक नहीं है इसलिए मैं इसे डाउनलोड कर रहा हूं (मेरा कनेक्शन बहुत धीमा है)। इस बीच, मैंने खुद के अलावा कुछ और रखा। –

+0

ठीक है, मेरे पास सी ++ मानक है, लेकिन इसे नहीं मिल सकता है, संभवतः क्योंकि यह वास्तव में सी (सी 99 नहीं) मानक में परिभाषित है। मुझे उम्मीद है कि कोई इसे ट्रैक करेगा, क्योंकि मुझे लगता है कि यह एक दिलचस्प सवाल है! –

+0

ध्यान रखें कि cplusplus.com में कुछ अजीब साइटें हैं। इसे देखें, उदाहरण के लिए: http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/ अब ऑपरेटर के मजेदार हस्ताक्षर हैं << :) –

14

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

46

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

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

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

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

सामग्री मानक सी पुस्तकालय हेडर के रूप में एक ही हैं <stddef.h> [...]

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

पुस्तकालय आईएसओ/आईईसी के खंड 7 में वर्णित 9899: के आईएसओ/आईईसी 9899/Amd.1 1990 और खंड 7: 1995 है इसके बाद कॉल करें मानक सी लाइब्रेरी संपादित करें।

size_t के बारे में कुछ हिस्सों ANSI C से विरासत में मिला दिया जाना चाहिए: Frontmatter और अनुभाग अलग नंबर, C90 और ANSI C के लिए मानकों के समान हैं। मुझे यह सुनिश्चित करने के लिए मानक संशोधन की एक प्रति की आवश्यकता होगी कि stddef.h में कोई प्रासंगिक परिवर्तन नहीं है, लेकिन मुझे शक है। लगता है कि न्यूनतम आकार stdint.h, यानी सी 99 के साथ पेश किया जा रहा है।

कृपया अनुभाग 1 से निम्नलिखित उद्धरण पर भी विचार करें।के सी ++ 98 2:

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

+0

दुर्भाग्य से, प्रश्न C99 लेकिन C++ के बारे में नहीं है। –

+8

@Neil, उसे सी मानक लेना है, क्योंकि सी ++ मानक इसे प्रतिनिधि करता है :) यह खुद आकार_टी को परिभाषित नहीं करता है :) –

+2

हां, लेकिन सी ++ मानक सी 99 मानक का संदर्भ नहीं देता है। –

5

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

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

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

हस्ताक्षरित किया गया है मुझे यकीन है कि कैसे महत्वपूर्ण यह है कि से बचने के लिए किया जाएगा नहीं कर रहा हूँ। मेरा कोड मानता है कि यह हस्ताक्षरित है।

+0

संपादित करेंगे मुझे लगता है कि हर कोई जानता है कि यह शायद हस्ताक्षरित है - लेकिन जब तक कोई प्रासंगिक मानदंड दस्तावेज उद्धृत नहीं कर लेता है, हम निश्चित रूप से कभी नहीं जानते। –

+0

मेरे पास इस समय मानक दस्तावेज़ आसान नहीं है (हालांकि मुझे विश्वास है कि सभी प्रासंगिक मानकों, सी 0 9, सी 99 और सी ++ 98 और इसके बाद इसे बिना हस्ताक्षर किए जाने की आवश्यकता है)। हालांकि, मैं बस यह इंगित करना चाहता था कि मानक के बावजूद, संभावित रूप से महत्वपूर्ण अपवाद हैं जहां size_t एक हस्ताक्षरित प्रकार है। –

2

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

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

टेबल प्रकार परिभाषित के रूप में 15 सूचियां: ptrdiff_t और size_t

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

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

1

ओह, यह सिर्फ भयानक है:

vector<MyObject> arr; 
Fill(arr); 
size_t size = arr.size(); 
for(size_t i = 1; i < size - 1; ++i) 
{ 
    auto obj = arr[i]; 
    auto next = arr[i+1]; 
} 

अब उपयोग के मामले जहां आगमन खाली है मनन।

संबंधित मुद्दे