<cstdint> बनाम <stdint.h>


95

बीच क्या अंतर है stdint.hऔर cstdint?

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

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

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

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

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

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

OS X 10.8 की कमी है <cstdint>। यहाँ त्रुटि मैं प्राप्त है: ./misc.h:7:10: fatal error: 'cstdint' file not found
jww

जवाबों:


122

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

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

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

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

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

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


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

24
@PaperBirdMaster: सी ++ मानक पुस्तकालय हेडर फ़ाइल एक्सटेंशन नहीं है: <iostream>, <vector>, <cstdlib>, अलग सी संगतता के लिए शामिल किए गए लोगों से: <stdint.h>, <stdlib.h>। और हाँ, प्रारंभिक cइंगित करता है कि <cstdlib>C ++ के सी हेडर के बराबर C ++ है , जो कि C ++ की <stdlib.h>तरह पूर्ण रूप से नया <vector>है। C ++ हैडर है <complex>, इसलिए हमें बस यह उम्मीद करनी होगी कि C का कोई भी भविष्य का संस्करण एक मानक हैडर का परिचय न दे <omplex.h>
11:17

@SteveJessop Erm, C99?
एसएस ऐनी

1
@ JL2210 ने कहा कि उन्होंने कहा <omplex.h>, नहीं <complex.h>। यदि C जोड़ा जाता है <omplex.h>, तो C ++ समतुल्य होगा <complex>
जॉन लेउन्हेगन

16

जिसमें cstdintstd namespace और संभवतः Global namespace में प्रतीक नाम आयात करना शामिल है ।
जिसमें stdint.hग्लोबल नेमस्पेस में और संभवतः एसडीएम नेमस्पेस में प्रतीक नामों को आयात करना शामिल है ।

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

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

#include <cstdint>

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

#include <stdint.h>

अनुलग्नक डी (मानक) संगतता सुविधाएँ [depr] बताती हैं:

D.6 C मानक लाइब्रेरी हेडर

1 सी मानक पुस्तकालय और सी यूनिकोड टीआर के साथ संगतता के लिए, सी ++ मानक पुस्तकालय 25 सी हेडर प्रदान करता है, जैसा कि तालिका 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 प्रत्येक C हैडर, जिनमें से प्रत्येक का एक नाम है name.h, व्यवहार करता है जैसे कि प्रत्येक नाम मानक लाइब्रेरी नेमस्पेस cname headerमें रखा गया है जो कि ग्लोबल नेमस्पेस दायरे में रखा गया है। यह अनिर्दिष्ट है कि इन नामों को पहले घोषित किया गया है या नाम स्थान std के नाम स्थान गुंजाइश (3.3.6) के भीतर परिभाषित किया गया है और फिर स्पष्ट उपयोग-घोषणाओं (7.3.3) द्वारा वैश्विक नाम स्थान गुंजाइश में इंजेक्ट किया जाता है।

3 [उदाहरण: हेडर <cstdlib>ने नेमस्पेस std के भीतर अपनी घोषणाओं और परिभाषाओं को सुनिश्चित किया है। यह वैश्विक नामस्थान के भीतर ये नाम भी प्रदान कर सकता है। हेडर <stdlib.h>आश्वस्त रूप से वैश्विक नेमस्पेस के भीतर समान घोषणाएं और परिभाषाएं प्रदान करता है, जितना कि सी स्टैंडर्ड में। यह नामस्थान std के भीतर ये नाम भी प्रदान कर सकता है। उदाहरण का]


-1
  1. cstdintC ++ 11 हेडर है, stdint.hC99 हैडर है (C और C ++ अलग-अलग भाषाएं हैं!)

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

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


2
3. गलत है। cstdintनेमस्पेस में कार्यान्वयन को फहराने की जरूरत है std
कोनराड रुडोल्फ 10

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

@chill, क्या आप अनुलग्नक डी को लिंक प्रदान कर सकते हैं? यहाँ en.cppreference.com/w/cpp/types/integer ने कहा कि C ++ 11 हैडर है।
हेट-इंजन

1
@ नफरत-इंजन, मेरा सुझाव है कि आप इसे C ++ मानक की अपनी प्रति में देखें। उस cppreference पृष्ठ का उल्लेख नहीं है stdint.h। कोई तर्क नहीं है कि cstdintC ++ हैडर है।
चिल

2
1. का कोई भी हिस्सा गलत नहीं है, यह सिर्फ इतना है कि इसे एक साथ लिया जाता है जैसा कि आप कह रहे हैं कि stdint.hयह C ++ 11 का हिस्सा नहीं है। वास्तव में यह C ++ 11 द्वारा आवश्यक है। आप कह सकते हैं, " intC ++ 11 में है; longC99 में है; C और C ++ अलग-अलग भाषाएं हैं!", और इसका कोई भी हिस्सा गलत नहीं होगा। मेरा उदाहरण और भी अधिक भ्रामक है, हालाँकि, C ++ 11 में भाग C99 को संदर्भित करता है , दोनों की सामग्री को परिभाषित करने के लिए stdint.hऔर cstdint, लेकिन C को परिभाषित करने के लिए संदर्भित नहीं करता है int
स्टीव जेसप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.