Size_t और std :: size_t के बीच अंतर


139

क्या अंतर हैं size_tऔर std::size_tजहां वे घोषित किया गया है के संदर्भ में, जब वे इस्तेमाल किया जाना चाहिए और किसी भी अन्य फर्क सुविधाओं?


मुझे यह जानने में दिलचस्पी होगी कि क्या C ++ कल्पना लिंक std :: size_t to C size_t प्रकार है।
डग टी।

इसी तरह का प्रश्न देखें: लिंक
मँकारसे २ question

जवाबों:


88

C size_tऔर C ++ के std::size_tदोनों समान हैं।

C में, इसे <stddef.h>C ++ में परिभाषित किया गया है, <cstddef>जिसकी सामग्री सी हेडर के समान है (नीचे उद्धरण देखें)। इसके रूप में परिभाषित किया गया आकार आकार ऑपरेटर के परिणाम के बिना अहस्ताक्षरित पूर्णांक प्रकार के ।

C मानक C17.7 / 2 में कहता है,

size_t जो अहस्ताक्षरित पूर्णांक प्रकार है कि आकार के ऑपरेटर परिणाम का

और C ++ मानक Standard18.1 cstddef/ 3 में हेडर के बारे में कहता है,

सामग्री मानक C लाइब्रेरी हेडर के समान है, निम्नलिखित परिवर्तनों के साथ

तो हाँ, दोनों समान हैं; एकमात्र अंतर यह है कि C ++ परिभाषित करता हैsize_tstd नेमस्पेस में किया है।

कृपया ध्यान दें कि उपरोक्त लाइन "निम्नलिखित परिवर्तनों के साथ" भी कहती है है, जिसका संदर्भ नहीं है size_t। इसकी बजाय C ++ द्वारा भाषा में किए गए नए परिवर्धन (अधिकतर) का जिक्र है (C में मौजूद नहीं है) जो एक ही हेडर में भी परिभाषित हैं।


विकिपीडिया में size_t की श्रेणी और भंडारण आकार के बारे में बहुत अच्छी जानकारी है:

आकार_त की सीमा और भंडारण आकार

वास्तविक size_t के प्रकार है मंच पर निर्भर ; एक आम गलती , ग्रहण करने के लिए size_t अहस्ताक्षरित पूर्णांक के रूप में ही है, जो प्रोग्रामिंग त्रुटियों का कारण बन सकता है [3] [4] जब, 64-बिट वास्तुकला के लिए 32 से चलती उदाहरण के लिए।

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

और बाकी आप इस पेज से विकिपीडिया पर पढ़ सकते हैं ।


Thats एक और Q में लाता है, अगर STL पहले से ही C (cstddef) के माध्यम से size_t आयात करता है, तो इसका अपना नया संस्करण क्यों है?
आलोक सेव 4

43
@ एल्स: सख्ती से बोलना, यह size_tबिना किसी त्रुटि के using namespace std;या कहने के लिए एक त्रुटि है using std::size_t;। हालांकि, अधिकांश संकलक इसे अनुमति देते हैं, और मानक विशेष रूप से उन्हें इसे अनुमति देने की अनुमति देता है (/D.5 / 3)।
पोटाटोस्वाटर

9
@Potatoswatter: निश्चित रूप से यह मानक में त्रुटि और विशेष रूप से अनुमति दोनों नहीं हो सकती है? यदि यह मानक में है, तो यह एक त्रुटि नहीं है!
बेन हाइमर

8
@BenHymers मानक निर्दिष्ट करता है कि मानक हेडर क्या घोषित करते हैं, और उन्हें किसी अन्य गैर-आरक्षित नामों की घोषणा करने की अनुमति नहीं है। हैडर <cstddef>घोषित कर सकता है या नहीं भी कर सकता है ::size_t, इसलिए आप उस पर निर्भर होने या अनुपस्थित होने पर भरोसा नहीं कर सकते, जब तक कि विशेष रूप <stddef.h>से सी या लाइब्रेरी से एक और हेडर शामिल न हो, जिसे घोषित करने की गारंटी हो।
पोटाटोस्वाटर

4
@Potatoswatter: आह, मैं देख रहा हूं कि अब आपका क्या मतलब है! मुझे एक वाक्य में बहुत सारे "अनुमति" द्वारा भ्रमित होना चाहिए। मुझे अभी भी लगता है कि आपकी पहली टिप्पणी हालांकि बहुत मजबूत है; जैसा कि आपने अभी कहा है, ::size_tउदाहरण के लिए मौजूद है <stddef.h>, इसलिए आपको हमेशा इसके साथ अर्हता प्राप्त करने की आवश्यकता नहीं है std::
बेन हाइमर

16

C ++ 03 "17.4.3.1.4 प्रकार" से:

मानक सी लाइब्रेरी (फुटनोट 169) से प्रत्येक प्रकार टी के लिए, प्रकार :: टी और एसटी :: टी कार्यान्वयन के लिए आरक्षित हैं और, परिभाषित किए जाने पर :: टी टी एसटी के समान होगा :: टी।

और फुटनोट 169:

ये प्रकार हैं घड़ी_ट, दिवा_त, फील, फपोस_टी, लोनव, ल्दिवि_ट, मबस्सट_त, पितृदफ_ट, सिग_तोमिक_t, size_t, time_t, tm, va_list, wctrans_t, wctype_t, और wint_t।


तो पोर्टेबल कोड को std::Tपरिभाषित किए जा रहे वेरिएंट पर निर्भर नहीं होना चाहिए ?
मकार्से

5
@ मानकार्से: यदि आप केवल संबंधित हेडर के सी संस्करण को शामिल करते हैं, तो आपको उन पर निर्भर नहीं होना चाहिए । यदि आप #include <stddef.h>तब std::size_tउपलब्ध हो सकते हैं या नहीं हो सकते हैं। यदि आप #include <cstddef>तब std::size_tउपलब्ध हैं, लेकिन size_tनहीं हो सकता है।
डेनिस ज़िकफ़ोज़

4
@ मानकारसे: ऑपोजिट। हेडर के C ++ संस्करणों को उन्हें परिभाषित करना होगा std::और पैराग्राफ कहता है कि यह उन्हें टॉप-लेवल नेमस्पेस में भी परिभाषित कर सकता है और यदि ऐसा होता है, तो उन्हें पहचान में std::और टॉप-लेवल में परिभाषित करना होगा । अधिकांश संकलक सिर्फ C शीर्ष लेख शामिल करते हैं और नामों को आयात करते हैं std::, इसलिए प्रतीक दोनों में परिभाषित होते हैं।
Jan Hudec

4
व्यक्तिगत रूप से, मैं कभी <cxxxxx> हेडर या std::पहचानकर्ताओं के वेरिएंट के साथ परेशान नहीं करता हूं जो सी किनारे से आते हैं। मैं <xxxxx.h>मानक सी हेडर के लिए छड़ी करता हूं - यह कभी भी समस्या नहीं रही है। तो, मैं का उपयोग करेंगे <stddef.h>और size_tऔर कभी भी न दें एक दूसरे सोचा std::size_t; वास्तव में, यह मेरे दिमाग को कभी भी पार नहीं करता है कि वहाँ (या हो सकता है) ए std::size_t
माइकल बूर

12

std :: size_t वास्तव में stddef.h का size_t है

cstddef निम्नलिखित देता है:

#include <stddef.h>
namespace std 
{
  using ::ptrdiff_t;
  using ::size_t;
}

... प्रभावी रूप से पिछली परिभाषा को स्टैड नेमस्पेस में लाया।


जैसा कि नवाज बताते हैं, यह वास्तव में दूसरा तरीका है। आप शामिल नहीं कर सकते <cstddef>और प्राप्त करने की अपेक्षा करते हैं ::size_t, लेकिन यदि आप शामिल <stddef.h>करते हैं तो आपको मिलेगा std::size_t
एमएसलटर्स

4
@ मालिक, मैं अनुसरण नहीं करता। सहित <stddef.h>केवल आप मिल जाएगा ::size_t
hifier

2
यह आपके कार्यान्वयन में एक बग है, फिर।
MSalters

4
@MSalters, मैं काफी पालन नहीं करते। क्या यह दूसरा रास्ता नहीं होना चाहिए? <cstddef> C ++ से आता है, इस प्रकार std में सामान को परिभाषित करना चाहिए :: *? दूसरी ओर, एक सी हेडर में, stddef.h की तरह, मैं केवल C टाइप की उम्मीद करूंगा, अर्थात :: size_t।
इला .२ El२

11
@ निर्माता, C ++ 11 के बाद से यह सटीक नहीं है। यदि आप शामिल हैं, <cstddef>तो आपको प्राप्त करने की गारंटी है std::size_tऔर आप भी प्राप्त कर सकते हैं ::size_t(लेकिन इसकी गारंटी नहीं है)। यदि आप शामिल हैं, <stddef.h>तो आपको प्राप्त करने की गारंटी है ::size_tऔर आप भी प्राप्त कर सकते हैं std::size_t(लेकिन इसकी गारंटी नहीं है)। यह C ++ 03 में अलग था लेकिन यह प्रभावी रूप से लागू नहीं था और दोष के रूप में तय किया गया था।
जोनाथन वैक्ली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.