2012-11-30 21 views
60

stdint.h और cstdint के बीच क्या अंतर है?<cstdint> बनाम <stdint.h>

उनमें से दोनों एमएसवीसी (विजुअल स्टूडियो 2010) और जीसीसी-4.5.1 में उपलब्ध हैं। इसके अलावा intX_t/uintX_t प्रकारों को परिभाषित करें (जहां X प्रकार के बाइट्स में आकार है)।

  • यदि दोनों शीर्षकों में तर्क समान (पोर्टेबल प्रकार) है, तो मुझे एक या दूसरे पर निर्णय लेने के लिए क्या निर्णय लेना चाहिए?

stdint.h किसी भी नाम स्थान के बिना प्रत्येक प्रकार परिभाषित करता है, cstdint प्रकार std नाम स्थान में निहित है।

  • क्या परिभाषित प्रकारों को std नामस्थान में शामिल करने या शामिल करने का कोई कारण नहीं है? दो शीर्षकों के बीच क्या अंतर है?

cstdint कोई फाइल एक्सटेंशन stdint.h.h एक्सटेंशन का उपयोग करता है और c उपसर्ग का उपयोग करता है,।

  • इस शीर्षलेख के लिए नामकरण सम्मेलन क्या हैं? c उपसर्ग यह इंगित करता है कि यह एक सी पुस्तकालय है? cstdint में फ़ाइल एक्सटेंशन की कमी के कारण हैं?
+0

ओएस एक्स 10.8 में '' की कमी है। यहां मुझे मिली त्रुटि है: * '/ misc.h: 7: 10: घातक त्रुटि: 'cstdint' फ़ाइल नहीं मिली * *। – jww

+2

संबंधित: [सी ++ में सी हेडर का उपयोग करते समय, क्या हमें std :: या वैश्विक नेमस्पेस से फ़ंक्शंस का उपयोग करना चाहिए?] (Http://stackoverflow.com/q/32606023/2020827) – sergej

उत्तर

88

सी ++ 98 में मूल इरादा था कि तुम सी में <cstdint> का उपयोग करना चाहिए ++, वैश्विक नामस्थान (अच्छी तरह से, विशेष रूप से नहीं <cstdint> प्रदूषण से बचने के लिए, यह है कि केवल सी ++ 11 है, लेकिन <c*> में जोड़ दिया जाता है सामान्य में हेडर)।

हालांकि, प्रतीकों को वैश्विक नामस्थान में प्रतीकों को डालने में जारी रखा गया, और सी ++ 11 ने इस अभ्यास को अनुमोदित किया [*]। तो, आप मूल रूप से तीन विकल्प हैं:

  • उपयोग <cstdint> और या तो पूरी तरह आप का उपयोग वरना यह गुंजाइश में लाने using std::int32_t; आदि (क्योंकि वर्बोज़ कष्टप्रद के साथ प्रत्येक पूर्णांक प्रकार चुने जाते हैं, लेकिन यह यह सिर्फ करने के लिए की तरह करने के लिए सही रास्ता है सी ++ मानक पुस्तकालय में किसी भी अन्य प्रतीक)
  • उपयोग <stdint.h> (थोड़ा बुरा क्योंकि हटा दिया गया)
  • उपयोग <cstdint> और अपने कार्यान्वयन वैश्विक नामस्थान (बहुत बुरा है क्योंकि इसकी गारंटी नहीं) में प्रतीकों डाल देंगे मान।

अभ्यास में मुझे लगता है कि कोड की एक कष्टप्रद बड़ी राशि आखिरी विकल्प का उपयोग करता है, क्योंकि यह एक कार्यान्वयन जहां <cstdint> ग्लोबल नेम स्पेस में प्रतीकों डालता है पर दुर्घटना से ऐसा करना आसान है पर शक। आपको पहले उपयोग करने की कोशिश करनी चाहिए। दूसरे में एक गुण है, यह की गारंटी देता है ताकि वैश्विक नामस्थान में सामान केवल इसे करने के बजाय रखा जा सके। मुझे नहीं लगता कि यह विशेष रूप से उपयोगी है, लेकिन अगर यह आपकी प्राथमिकता है तो यह कुछ टाइपिंग बचा सकता है।

एक चौथा विकल्प, #include <cstdint> है जिसके बाद using namespace std; है जो कभी-कभी उपयोगी होता है लेकिन ऐसे स्थान हैं जहां आपको using namespace std; नहीं रखना चाहिए। अलग-अलग लोगों के पास अलग-अलग विचार होंगे जहां वे स्थान हैं, लेकिन "हेडर फ़ाइल में शीर्ष स्तर पर" एक सीपीपी फ़ाइल में शीर्ष स्तर पर "से भी बदतर है, जो" सीमित दायरे में "से भी बदतर है। कुछ लोग कभी भी using namespace std; लिखते हैं।

[*] इसका मतलब है कि सी ++ मानक शीर्षलेखों को वैश्विक नामस्थान में सामान डालने की अनुमति है लेकिन इसकी आवश्यकता नहीं है। तो आपको उन प्रतीकों से टकराने से बचना होगा, लेकिन आप वास्तव में उनका उपयोग नहीं कर सकते क्योंकि वे वहां नहीं हो सकते हैं। असल में, सी ++ में वैश्विक नामस्थान एक खनन क्षेत्र है, इसे टालने का प्रयास करें।कोई तर्क दे सकता है कि समिति ने कार्यान्वयन द्वारा एक अभ्यास को मंजूरी दे दी है जो हेडर फ़ाइल में शीर्ष स्तर पर using namespace std; चिपकाने के रूप में लगभग हानिकारक है - यह अंतर यह है कि कार्यान्वयन केवल सी मानक पुस्तकालय में प्रतीकों के लिए करते हैं, जबकि using namespace std; करता है सी ++ के लिए - केवल प्रतीक भी। सी मानक में एक अनुभाग है जो मानक के लिए भविष्य के जोड़ों के लिए आरक्षित नाम सूचीबद्ध करता है। सी ++ वैश्विक नामस्थान में आरक्षित उन नामों का इलाज करने के लिए यह पूरी तरह से बेवकूफ विचार नहीं है, लेकिन यह आवश्यक नहीं है।

+0

हेडर फाइलों के नामकरण सम्मेलनों के बारे में एकमात्र अनुत्तरित प्रश्न है, क्या आप इस विषय के बारे में जानते हैं? –

+19

@PaperBirdMaster: C++ मानक लाइब्रेरी शीर्षलेख में फ़ाइल एक्सटेंशन नहीं हैं: '', '', '', सी संगतता के लिए शामिल किए गए लोगों के अलावा: '', ''। और हां, शुरुआती 'सी' इंगित करता है कि' 'सी ++ के मानक मानक हेडर' 'के समतुल्य है, सी ++ के लिए बिल्कुल नया होने की बजाय '' है। एक सी ++ हेडर '' है, इसलिए हमें उम्मीद करनी होगी कि सी का कोई भविष्य संस्करण मानक हेडर '' प्रस्तुत नहीं करता है। –

13

cstdint सहित वैश्विक नाम स्थान में संभवतः एसटीडी नाम स्थान में प्रतीक नाम और आयात करता है।
stdint.h सहित वैश्विक नामस्थान और में संभवतः में नाम नाम आयात करता है।

सी मानक लाइब्रेरी में सी मानक लाइब्रेरी की विशेषताएं भी प्रदान की जाती हैं और सामान्य नामकरण सम्मेलन के रूप में वे सी मानक पुस्तकालय में संबंधित नामों के लिए एक सी द्वारा प्री-पेंड किए जाते हैं।

सी ++ में, आप का उपयोग करना चाहिए:

#include <cstdint> 

और पूरी तरह से प्रतीक नाम आप के साथ सी में std::
जबकि का उपयोग चुने जाते हैं, आप का उपयोग करना चाहिए:

#include <stdint.h> 

अनुलग्नक डी (मानक) संगतता विशेषताएं [depr] राज्य:

डी।6 सी मानक पुस्तकालय हेडर

1 For compatibility with the C standard library and the C Unicode TR, the C++ standard library provides the 25 C headers, as shown in Table 151.

शामिल हैं:

<assert.h> <float.h> <math.h> <stddef.h> <tgmath.h> <complex.h> <inttypes.h> <setjmp.h> <stdio.h> <time.h> <ctype.h> <iso646.h> <signal.h> <stdint.h> <uchar.h> <errno.h> <limits.h> <stdarg.h> <stdlib.h> <wchar.h> <fenv.h> <locale.h> <stdbool.h> <string.h> <wctype.h>

और आगे,

2 Every C header, each of which has a name of the form name.h , behaves as if each name placed in the standard library namespace by the corresponding cname header is placed within the global namespace scope. It is unspecified whether these names are first declared or defined within namespace scope (3.3.6) of the namespace std and are then injected into the global namespace scope by explicit using-declarations (7.3.3).

3 [ Example: The header <cstdlib> assuredly provides its declarations and definitions within the namespace std. It may also provide these names within the global namespace. The header <stdlib.h> assuredly provides the same declarations and definitions within the global namespace, much as in the C Standard. It may also provide these names within the namespace std. —end example ]

0
  1. cstdint सी ++ 11 हेडर है, stdint.h (C99 शीर्षक है सी और सी ++ अलग-अलग भाषाएं हैं!)

  2. एमएसवीसी 2008 में न तो stdint.h और न ही cstdint शामिल है।

  3. cstdint के कार्यान्वयन कुछ नामस्थान/भाषा सुधारों के साथ अधिकतर #include <stdint.h> हैं।

+1

3. गलत है। 'cstdint' को नामस्थान 'std' में कार्यान्वयन को उठाने की आवश्यकता है। –

+0

1. गलत भी है, stdint.h को C++ लाइब्रेरी के एक मानक के रूप में परिभाषित किया गया है जो सी ++ मानक के मानक अनुलग्नक डी में है। – chill

+0

@ कोनराड रुडॉल्फ, धन्यवाद, तय। –

संबंधित मुद्दे