यहाँ मेरा कोड है:

#include <iostream>

int main()
{
    int32_t i = 5;
    std::cout << "i: " << i << '\n';
}

यहाँ आउटपुट है:

$ clang++ -std=c++11 -pedantic -Wall -Wextra foo.cpp && ./a.out 
i: 5

यहाँ मेरा प्रश्न है:

ऐसा प्रतीत होता है कि C++ मानक int32_t को cstdint में std नामस्थान में परिभाषित करता है।

मेरे कोड में, मैंने न तो cstdint शामिल किया है और न ही मैं std नाम स्थान का उपयोग करता हूं। संकलक तब शिकायत क्यों नहीं करता?

9
Lone Learner 24 मई 2018, 12:02

1 उत्तर

सबसे बढ़िया उत्तर

int32_t नाम C लाइब्रेरी हैडर stdint.h के वैश्विक दायरे में भी दिखाई देता है। यह इसे विश्व स्तर पर C++ में भी दृश्यमान बना सकता है।

अनुभाग [Headers] कहता है:

... प्रत्येक शीर्षलेख की सामग्री cname वही है जो संबंधित शीर्षलेख name.h की है जैसा कि C मानक पुस्तकालय में निर्दिष्ट है। सी ++ मानक पुस्तकालय में, हालांकि, घोषणाएं (सी में मैक्रोज़ के रूप में परिभाषित नामों को छोड़कर) नेमस्पेस एसटीडी के नामस्थान क्षेत्र के भीतर हैं। यह निर्दिष्ट नहीं है कि क्या ये नाम ([भाषा। समर्थन] में [थ्रेड] और [depr] के माध्यम से जोड़े गए किसी भी अधिभार सहित) पहले वैश्विक नाम स्थान के दायरे में घोषित किए गए हैं और फिर नाम स्थान में अंतःक्षेपित किए गए हैं स्पष्ट उपयोग-घोषणाओं द्वारा एसटीडी

मानक में एक ब्लैंकेट स्टेटमेंट भी है:

एक सी ++ हेडर में अन्य सी ++ हेडर शामिल हो सकते हैं।

इसलिए <iostream> को शामिल करने से आपको स्ट्रीम ऑब्जेक्ट देखने की गारंटी मिलती है, लेकिन कुछ अन्य लाइब्रेरी सुविधाओं तक पहुंच प्राप्त करने के लिए भी हो सकता है।

चूंकि इन अप्रत्यक्ष शामिल अनिर्दिष्ट हैं, परिणाम कार्यान्वयन के बीच भिन्न होता है। इसलिए प्रोग्राम में हमेशा वे सभी हेडर शामिल होने चाहिए जिनकी उसे ज़रूरत है, एक अलग कंपाइलर के लिए पोर्टेबल होने के लिए।

11
Bo Persson 24 मई 2018, 12:45