2013-02-14 29 views
8

मैं थोड़ा ग ++ नया हूँ और मैं पहले से ही किया फ़ाइलों का एक बहुत कुछ के साथ एक कोडिंग काम किया है, लेकिन मैंने देखा है कि VS2012 निम्नलिखित बयान के साथ समस्या है लगता है:stint :: uint32_t uint32_t से अलग क्यों है?

typedef std::uint32_t identifier;

हालांकि, यह है कि यह

typedef uint32_t identifier;

के लिए बदल रहा त्रुटि से छुटकारा हो जाता है। इसमें कोई शामिल नहीं है और यह हेडर फ़ाइल में है। मैंने देखा कि परिभाषा stdint.h में है। यदि ऐसा है, तो यह कोड वीएस के बाहर स्वीकार्य क्यों है (यानी जी ++ का उपयोग करके ठीक से संकलित) लेकिन वीएस में अस्वीकार्य है? क्या कोई इसे समझा सकता है?

+0

यह वीएस 2010 में एक त्रुटि है। मैं वीएस 2012 का परीक्षण नहीं कर सकता क्योंकि यूआई स्थापित करने के लिए बहुत उपयोग करने योग्य नहीं था। –

+4

मेरा मानना ​​है कि आपको std namespace – Caesar

+1

@ कोडीग्रे के साथ प्राप्त करने के लिए 'cstdint' को शामिल करने की आवश्यकता है, ओपी वीएस2012 का उपयोग करने के लिए प्रतीत होता है, इसलिए UI उस अनुपयोगी नहीं है। –

उत्तर

10

अंतर यह है कि कोई नामस्थान के अंदर है और दूसरा नहीं है। अन्यथा वे वही होना चाहिए। पहला सी संस्करण होना चाहिए और दूसरा सी ++ संस्करण है। सी ++ 11 से पहले यह अनिवार्य था कि सी मानक लाइब्रेरी संस्करण के बजाय प्रीफिक्स्ड संस्करणों सहित मानक नामस्थान के अंदर सभी सी परिभाषाएं लाती हैं। सी ++ में 11 इस प्रतिबंध को आराम दिया गया है क्योंकि यह हमेशा संभव नहीं होता है।

यह हो सकता है कि आपका कंपाइलर इस प्रकार को स्पष्ट रूप से परिभाषित करता है। किसी भी मामले में, आपको नामस्थान std में संस्करण बनाने के लिए cstdint शामिल करना चाहिए (और संभवतः वैश्विक नामस्थान में से एक)। stdint.h सहित केवल अयोग्य संस्करण उपलब्ध कराया जाना चाहिए।

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

इस पागलपन के कारण, अधिकांश लोग तीसरे पक्ष के कार्यान्वयन पर वापस आ जाएंगे जैसे boost/cstdint.hpp

संपादित करें: वे वही हैं और एक ही उद्देश्य की सेवा करते हैं। नियम के रूप में: यदि आप std नामस्थान में संस्करण का उपयोग करना चाहते हैं, तो cstdint शामिल करें। यदि आप वैश्विक नामस्थान में से एक चाहते हैं, तो stdint.h शामिल करें। C++ के लिए std नामस्थान में से किसी एक का उपयोग करने की अनुशंसा की जाती है। एक नियम के रूप में: हमेशा जो भी आप उपयोग करते हैं उसे शामिल करें और अन्य शीर्षकों पर भरोसा न करें जिसमें आपके लिए चीजें शामिल हैं।

+0

लेकिन अनिवार्य रूप से, उनकी कार्यक्षमता समान है? – Lunyx

+0

@ डैनियल हां। मुझे और अधिक जोर देना चाहिए था। टूटे हुए कंपाइलरों के बारे में सभी बात शायद मददगार से ज्यादा भ्रमित है। – pmr

7

uint32_t (उर्फ ::uint32_t यानी वैश्विक नामस्थान में से एक) <stdint.h> में घोषित किया गया है। वह हेडर भी std में std::uint32_t के रूप में नामस्थान में घोषित कर सकता है, लेकिन ऐसा करने की आवश्यकता नहीं है।

std::uint32_t (यानी नामस्थान std में से एक) <cstdint> में घोषित किया गया है। वह हेडर भी वैश्विक नामस्थान में ::uint32_t के रूप में घोषित कर सकता है, लेकिन ऐसा करने की आवश्यकता नहीं है।

यदि ऐसा है, तो यह कोड वीएस के बाहर स्वीकार्य क्यों है (यानी जी ++ का उपयोग करके ठीक से संकलित) लेकिन वीएस में अस्वीकार्य है? क्या कोई इसे समझा सकता है?

आप उपयोग करना std::uint32_t तो आप #include <cstdint> चाहिए, या कोड संकलन नहीं कर सकते हैं चाहते हैं। यदि यह जी ++ के साथ संकलित करता है तो संभवतः कुछ अन्य शीर्षलेख पर अप्रत्यक्ष रूप से <cstdint> शामिल है लेकिन आपको उस पर भरोसा नहीं करना चाहिए, आपके द्वारा उपयोग किए जाने वाले नामों के लिए दायां शीर्षलेख शामिल करें।