size_t

2009-09-14 15 views
8

के लिए अमान्य मान लोग आकार_टी को इंगित करने के लिए क्या उपयोग करते हैं? -1 काम नहीं करता है, और 0 वैध आकार हो सकता है।size_t

+0

कैसे करता है -1 "काम नहीं"? –

+0

व्यक्तिगत रूप से, मैं गैर-पॉज़िक्स सिस्टम का उपयोग करने से इनकार करता हूं और मैं उपलब्ध होने पर 'ssize_t' पर भरोसा करता हूं। –

उत्तर

10

शायद ((size_t)-1)?

सच पूछिये तो, यह मान्य आकार है, लेकिन एक बार आप इस एक है आप किसी भी अन्य की जरूरत होने की संभावना नहीं कर रहे हैं ;-)

+1

सी 99 मल्टीबाइट स्ट्रिंग फ़ंक्शंस में से कुछ ऐसा करते हैं: वे असामान्य स्थितियों को इंगित करने के लिए '(size_t) (- 1)' या यहां तक ​​कि '(size_t) (- 2)' वापस लौटाते हैं; यह इष्टतम नहीं है, लेकिन यह अभ्यास में काम करता है; यदि आपके प्रश्न का कारण त्रुटि प्रबंधन है, तो एक सूचक चर को एक पॉइंटर पास करना बेहतर हो सकता है (उदाहरण के लिए '_Bool' प्रकार का त्रुटि ध्वज, प्रकार' int' का त्रुटि कोड या प्रकार का त्रुटि संदेश ' कॉन्स char * ') अतिरिक्त तर्क – Christoph

+0

हाँ, यह एक आम मुहावरे है। आप अक्सर '(time_t) -1' भी देख सकते हैं। –

+0

@ माइकल क्रेलिन-हैकर: '(time_t) -1' थोड़ा अलग है; मानक विशेष रूप से कहता है कि वर्तमान समय निर्धारित नहीं किया जा सकता है कि 'समय() 'द्वारा दिया गया मान है। और 'time_t' अक्सर एक हस्ताक्षरित प्रकार होता है, इसलिए' (time_t) -1' आमतौर पर युग से पहले 1 सेकंड होता है। –

3

असल में आप नहीं कर सकते हैं। जो भी मूल्य आप उपयोग करते हैं वह मान्य हो सकता है। एक ध्वज को बेहतर कहें कि यह अमान्य है।

1

और तुम क्या निरूपित करने के लिए है कि एक int अमान्य है क्या करते हो? -1 एक int के लिए एक वैध मूल्य है। इन प्रकारों ने "अमान्य" मान निर्दिष्ट नहीं किए हैं। आप एक अवैध मूल्य का प्रतिनिधित्व करने के लिए एक निश्चित मूल्य (जो आमतौर पर आपके चर का प्रतिनिधित्व करने का मूल्य कभी नहीं मान सकते हैं) चुनने का निर्णय ले सकते हैं, लेकिन यह आपकी खुद की परिभाषा है, और कुछ ऐसा नहीं जो लोग आम तौर पर उपयोग करते हैं।

व्यक्तिगत रूप से, मुझे इस तरह से पसंद नहीं है। मैं एक और चर, bool IsValid बनाना पसंद करता हूं, जो कहेंगे, कि उस size_t चर का मान मान्य है या नहीं। कभी-कभी, उन्हें कक्षा को बनाने के लिए भी बेहतर हो सकता है।

4

यदि आप std :: string के बारे में बात कर रहे हैं, तो size_t का अमान्य मान std :: string :: npos है। आम तौर पर आपको -1 का उपयोग नहीं करना चाहिए क्योंकि size_t को हस्ताक्षरित नहीं किया गया है, और आप प्रकार के बीच निहित रूपांतरण करने वाले संकलक पर असफल तुलना प्राप्त कर सकते हैं।

कहा जा रहा है कि, std :: तारों का npos 0XFFFFFFFFFFFFFFFFF पर सेट है ... जो -1 का बाइनरी समतुल्य है। यह एक हस्ताक्षरित size_t फ़ील्ड के लिए अधिकतम अनुमत मान का भी मूल्यांकन करता है।

+0

यह 'string :: size_type' है, 'size_t' नहीं ;-) –

+1

फिर भी ... बाकी उत्तर ठोस सोना है। ठोस सोना! – Kieveli

+0

कम से कम यह चमकता है ;-) –

0

मेरे संस्करण है:

#include <limits> 
#define invalid_index std::numeric_limits<size_t>::max() 
+3

'std :: numeric_limits :: अधिकतम प्रश्न) 'सी' में संकलित नहीं है क्योंकि इस प्रश्न को टैग किया गया है। – chux

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