क्या अंतर हैं size_t
और std::size_t
जहां वे घोषित किया गया है के संदर्भ में, जब वे इस्तेमाल किया जाना चाहिए और किसी भी अन्य फर्क सुविधाओं?
क्या अंतर हैं size_t
और std::size_t
जहां वे घोषित किया गया है के संदर्भ में, जब वे इस्तेमाल किया जाना चाहिए और किसी भी अन्य फर्क सुविधाओं?
जवाबों:
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_t
std
नेमस्पेस में किया है।
कृपया ध्यान दें कि उपरोक्त लाइन "निम्नलिखित परिवर्तनों के साथ" भी कहती है है, जिसका संदर्भ नहीं है size_t
। इसकी बजाय C ++ द्वारा भाषा में किए गए नए परिवर्धन (अधिकतर) का जिक्र है (C में मौजूद नहीं है) जो एक ही हेडर में भी परिभाषित हैं।
विकिपीडिया में size_t की श्रेणी और भंडारण आकार के बारे में बहुत अच्छी जानकारी है:
आकार_त की सीमा और भंडारण आकार
वास्तविक size_t के प्रकार है मंच पर निर्भर ; एक आम गलती , ग्रहण करने के लिए size_t अहस्ताक्षरित पूर्णांक के रूप में ही है, जो प्रोग्रामिंग त्रुटियों का कारण बन सकता है [3] [4] जब, 64-बिट वास्तुकला के लिए 32 से चलती उदाहरण के लिए।
1999 आईएसओ सी मानक (C99) के अनुसार, size_t कम से कम 16 बिट्स का एक अहस्ताक्षरित पूर्णांक प्रकार है।
और बाकी आप इस पेज से विकिपीडिया पर पढ़ सकते हैं ।
size_t
बिना किसी त्रुटि के using namespace std;
या कहने के लिए एक त्रुटि है using std::size_t;
। हालांकि, अधिकांश संकलक इसे अनुमति देते हैं, और मानक विशेष रूप से उन्हें इसे अनुमति देने की अनुमति देता है (/D.5 / 3)।
<cstddef>
घोषित कर सकता है या नहीं भी कर सकता है ::size_t
, इसलिए आप उस पर निर्भर होने या अनुपस्थित होने पर भरोसा नहीं कर सकते, जब तक कि विशेष रूप <stddef.h>
से सी या लाइब्रेरी से एक और हेडर शामिल न हो, जिसे घोषित करने की गारंटी हो।
::size_t
उदाहरण के लिए मौजूद है <stddef.h>
, इसलिए आपको हमेशा इसके साथ अर्हता प्राप्त करने की आवश्यकता नहीं है std::
।
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
परिभाषित किए जा रहे वेरिएंट पर निर्भर नहीं होना चाहिए ?
#include <stddef.h>
तब std::size_t
उपलब्ध हो सकते हैं या नहीं हो सकते हैं। यदि आप #include <cstddef>
तब std::size_t
उपलब्ध हैं, लेकिन size_t
नहीं हो सकता है।
std::
और पैराग्राफ कहता है कि यह उन्हें टॉप-लेवल नेमस्पेस में भी परिभाषित कर सकता है और यदि ऐसा होता है, तो उन्हें पहचान में std::
और टॉप-लेवल में परिभाषित करना होगा । अधिकांश संकलक सिर्फ C शीर्ष लेख शामिल करते हैं और नामों को आयात करते हैं std::
, इसलिए प्रतीक दोनों में परिभाषित होते हैं।
std::
पहचानकर्ताओं के वेरिएंट के साथ परेशान नहीं करता हूं जो सी किनारे से आते हैं। मैं <xxxxx.h>
मानक सी हेडर के लिए छड़ी करता हूं - यह कभी भी समस्या नहीं रही है। तो, मैं का उपयोग करेंगे <stddef.h>
और size_t
और कभी भी न दें एक दूसरे सोचा std::size_t
; वास्तव में, यह मेरे दिमाग को कभी भी पार नहीं करता है कि वहाँ (या हो सकता है) ए std::size_t
।
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
।
<stddef.h>
केवल आप मिल जाएगा ::size_t
।
<cstddef>
तो आपको प्राप्त करने की गारंटी है std::size_t
और आप भी प्राप्त कर सकते हैं ::size_t
(लेकिन इसकी गारंटी नहीं है)। यदि आप शामिल हैं, <stddef.h>
तो आपको प्राप्त करने की गारंटी है ::size_t
और आप भी प्राप्त कर सकते हैं std::size_t
(लेकिन इसकी गारंटी नहीं है)। यह C ++ 03 में अलग था लेकिन यह प्रभावी रूप से लागू नहीं था और दोष के रूप में तय किया गया था।