c++ - क्या "std:: size_t" सी++ में समझ में आता है?




size-t (6)

size_t C ++ में बनाया नहीं है और यह डिफ़ॉल्ट रूप से परिभाषित नहीं है यह जीसीसी के साथ संकलित नहीं करता है:

int main(int argc, char** argv) {
size_t size;
}

उसने कहा, आकार_टी पॉसिक्स का हिस्सा है और यदि आप केवल <cstdlib> जैसी मूलभूत चीजों का उपयोग करते हैं, तो संभवतः आप इसे परिभाषित करते रहेंगे।

आप यह तर्क दे सकते हैं कि std :: size_t size_t का C ++ बराबर है जैसा कि ब्रायन ने बताया है, std :: को वैश्विक वैरिएबल सेट करने से बचने के लिए नेमस्पेस के रूप में उपयोग किया जाता है जो कि सभी के लिए उपयुक्त नहीं हैं। यह सिर्फ std :: स्ट्रिंग की तरह है, जो रूट नेमस्पेस में भी परिभाषित किया जा सकता था।

कुछ कोड में मुझे विरासत में मिला है, मुझे size_t नेमस्पेस क्वालिफायर के साथ size_t का लगातार उपयोग दिखाई देता है उदाहरण के लिए:

std::size_t n = sizeof( long );

यह संकलन करता है और ठीक है, ज़ाहिर है। लेकिन यह मेरे लिए बुरा व्यवहार जैसा लगता है (संभवतः सी से लिया जाता है?)

क्या यह सच नहीं है कि size_t को C ++ में बनाया गया है और इसलिए वैश्विक नामस्थान में? C ++ में size_t का उपयोग करने के लिए एक शीर्ष लेख फ़ाइल शामिल है?

यह सवाल पूछने का एक और तरीका है, क्या निम्नलिखित प्रोग्राम (इसमें शामिल नहीं होगा ) को सभी सी ++ कंपाइलरों पर संकलन करने की अपेक्षा की जाती है?

size_t foo()
{
    return sizeof( long );
}

आप वैश्विक नाम स्थान में size_t प्राप्त कर सकते हैं, उदाहरण के लिए, <stddef.h> स्थान पर। मैं कोई स्पष्ट लाभ नहीं देख सकता, और इस सुविधा को नापसंद किया गया है


सी ++ मानक, अनुच्छेद 4 के खंड 17.4.1.2 में कहा गया है कि:

"सी ++ स्टैंडर्ड लाइब्रेरी में, हालांकि, घोषणाएं और परिभाषाएं (नामों को छोड़कर जिन्हें सी में मैक्रोज़ के रूप में परिभाषित किया गया है) नाम स्थान के स्केप (3.3.5) में हैं।"

इस में cstddef सहित पैटर्न cname के शीर्ष लेख में शामिल आइटम भी शामिल हैं, जो size_t को परिभाषित करता है।

तो std :: size_t वास्तव में सही है


इस बारे में स्टैकहोवरफ्लो भीड़ के बीच भ्रम हो रहा है

::size_t को पिछड़े संगतता शीर्षलेख stddef.h में परिभाषित किया गया है। यह उनकी बहुत शुरुआत से ANSI/ISO C और ISO C++ रहा है। प्रत्येक C ++ कार्यान्वयन को stddef.h (संगतता) और cstddef साथ जहाज करना stddef.h जहां केवल बाद std::size_t को परिभाषित करता है और आवश्यक नहीं है ::size_t सी ++ मानक के अनुलग्नक डी देखें।


मुझे लगता है कि स्पष्टीकरण काफी स्पष्ट हैं std::size_t C ++ और ::size_t में अच्छी समझ बनाता है (कम से कम) सी में अच्छा समझ

हालांकि एक सवाल है। अर्थात् क्या यह मानना ​​सुरक्षित है कि ::size_t और std::size_t संगत हैं?

एक शुद्ध प्रकार से सुरक्षित परिप्रेक्ष्य से वे अनिवार्य रूप से एक समान नहीं होते हैं, जब तक कि वे कहीं भी परिभाषित नहीं होते हैं कि उन्हें समान होना चाहिए।

मुझे लगता है कि बहुत से लोग एक ला का उपयोग कर रहे हैं:

----
// a.hpp 
#include <string>

void Foo( const std::string & name, size_t value );

-----
// a.cpp
#include "a.hpp"

using namespace std;

void Foo( const string & name, size_t value ) 
{
  ...
}

इसलिए हेडर में आप defintely ::size_t प्रयोग करते हैं जबकि स्रोत फ़ाइल में आप std::size_t उपयोग करेंगे तो वे संगत होना चाहिए, है ना? अन्यथा आपको एक कंपाइलर त्रुटि मिलेगी।

/ माइकल एस।


std::size_t n = sizeof( long );

दरअसल, आपने पूछा नहीं है कि इसके बाद के संस्करण में क्या बुरा व्यवहार होता है। आकार_टी का उपयोग, एसटीडी नेमस्पेस के साथ योग्यता, ...

सी ++ मानक कहते हैं (18.1), आकार_टी मानक हैडर में परिभाषित एक प्रकार है। मैं सी भाषा से संभावित विरासत के बारे में किसी भी विचार और इंप्रेशन ड्रॉप करने का सुझाव देता हूं। सी ++ एक अलग और अलग भाषा है और इसे इस पर विचार करना बेहतर है इसके पास अपनी मानक पुस्तकालय है और सी ++ स्टैंडर्ड लाइब्रेरी के सभी तत्वों को नेमस्पेस स्टडी में परिभाषित किया गया है। हालांकि, सी ++ प्रोग्राम में सी मानक पुस्तकालय के तत्वों का उपयोग करना संभव है।

मैं एक गंदा हैक के रूप में शामिल विचार करना चाहिए। सी ++ मानक बताता है कि हेडरों की सामग्री समान है या सी मानक पुस्तकालय से संबंधित हेडर पर आधारित है, लेकिन मामलों की संख्या में, परिवर्तन लागू किए गए हैं। दूसरे शब्दों में, यह सी कॉपी की एक सी कॉपी और पेस्ट नहीं है, सी + हेडर में।

size_t C ++ में एक अंतर्निहित प्रकार नहीं है यह निर्दिष्ट करने के लिए एक प्रकार परिभाषित किया गया है कि किस तरह के अभिन्न प्रकार का आकार वापसी के आकार के ऑपरेटर के रूप में उपयोग किया जाता है, क्योंकि वास्तविक आकार का आकार () कार्यान्वयन को परिभाषित किया गया है, इसलिए सी ++ मानक मानक आकार को परिभाषित करके जोड़ता है।

क्या निम्न प्रोग्राम (जिसमें कोई भी शामिल नहीं है) को सभी सी ++ कंपाइलरों पर संकलन करने की अपेक्षा की जाती है?

size_t foo()
{
    return sizeof( long );
}

सी ++ मानक कहते हैं (1.4):

पुस्तकालय में परिभाषित नामों में नाम स्थान का क्षेत्र (7.3) है। एसी + + अनुवाद यूनिट (2.1) इन मानक नामों को उचित मानक पुस्तकालय हेडर (16.2) को शामिल करके प्राप्त करता है।

आकार_टी एसटीडी नेमस्पेस में परिभाषित एक नाम है, इसलिए प्रत्येक नाम जो इस नाम का उपयोग करता है उसमें इसी शीर्ष लेख में शामिल होना चाहिए।

अगला, 3.7.3 अध्याय कहता है:

हालांकि, एसटीडी, std :: bad_alloc और std :: size_t का जिक्र है जब तक उपयुक्त शीर्षलेख शामिल करके नाम घोषित नहीं किया गया है।

यह देखते हुए, size_t का उपयोग कर कार्यक्रम, लेकिन शीर्षलेख सहित शामिल नहीं है।





size-t