2009-09-06 13 views
11

में क्रॉस-प्लेटफ़ॉर्म आदिम डेटा प्रकार जावा या सी # के विपरीत, सी ++ में आदिम डेटा प्रकार प्लेटफ़ॉर्म के आधार पर आकार में भिन्न हो सकते हैं। उदाहरण के लिए, int 32-बिट पूर्णांक होने की गारंटी नहीं है। विभिन्न कंपाइलर वातावरण इस उद्देश्य के लिए uint32 या dword जैसे डेटा प्रकारों को परिभाषित करते हैं, लेकिन ऐसा लगता है कि निश्चित आकार वाले डेटा प्रकारों के लिए कोई मानक फ़ाइल शामिल नहीं है।सी ++

अधिकतम पोर्टेबिलिटी प्राप्त करने के लिए अनुशंसित विधि क्या है?

उत्तर

11

मैं इस शीर्ष लेख विशेष रूप से उपयोगी पाया।

3

एक शीर्षलेख फ़ाइल में एक प्रकार (उदा। Int32) परिभाषित करें। प्रत्येक प्लेटफार्म के लिए एक और #ifdef का उपयोग करें और सुनिश्चित करें कि 3232 एक 32 बिट पूर्णांक है। अपने कोड उपयोग int32 में हर जगह और यह सुनिश्चित करें कि जब आप आप सही का उपयोग विभिन्न प्लेटफार्मों को परिभाषित

2

दो बातों पर संकलन करते हैं:

सबसे पहले, कि उपयोगी मंच के बहुत सारे देता है एक हेडर फाइल limits.h कहा जाता है विशिष्ट जानकारी। यह उदाहरण के लिए int प्रकार के लिए अधिकतम और न्यूनतम मान देगा। उस से, आप यह समझ सकते हैं कि int प्रकार कितना बड़ा है।

आप इन उद्देश्यों के लिए रनटाइम पर आकार के ऑपरेटर का भी उपयोग कर सकते हैं।

मुझे उम्मीद है कि इससे मदद मिलती है। । ।

कश्मीर

8

एक हैडर types.h बुलाया फ़ाइल बनाएँ, और सभी निश्चित-आकार आदिम प्रकार आप की जरूरत (int32, uint32, uint8, आदि) को परिभाषित। एकाधिक प्लेटफ़ॉर्म का समर्थन करने के लिए, आप या तो #ifdef का उपयोग कर सकते हैं या प्रत्येक प्लेटफ़ॉर्म (include_x86, include_x86_64, include_sparc) के लिए अलग-अलग निर्देशिका शामिल कर सकते हैं। बाद के मामले में आपके पास प्रत्येक प्लेटफ़ॉर्म के लिए अलग-अलग बिल्ड कॉन्फ़िगरेशन होंगे, जिसमें अधिकार शामिल होगा जिसमें उनके पथ शामिल हैं। स्टीफन डेहर्स्ट द्वारा "सी ++ गॉटचास" के अनुसार दूसरी विधि बेहतर है।

यदि आप विभिन्न प्लेटफार्मों के बीच बाइनरी डेटा पास करने की योजना बना रहे हैं, तो बस एक तरफ, आपको बाइट ऑर्डर के बारे में भी चिंता करनी होगी।

5

इस प्रकार की जानकारी प्रदान करने के लिए सी 99 मानक का हिस्सा stdint.h हेडर फ़ाइल था। उदाहरण के लिए, यह uint32_t नामक एक प्रकार को परिभाषित करता है। दुर्भाग्यवश, बहुत सारे कंपाइलर्स stdint.h का समर्थन नहीं करते हैं। मैंने stdint.h का सबसे अच्छा क्रॉस-प्लेटफ़ॉर्म कार्यान्वयन देखा है: http://www.azillionmonkeys.com/qed/pstdint.h। आप बस अपनी परियोजना में शामिल कर सकते हैं।

यदि आप बढ़ावा का उपयोग कर रहे हैं, तो मेरा मानना ​​है कि यह स्टिंट हेडर के बराबर कुछ भी प्रदान करता है।

2

सी 99 मानक और (मुझे लगता है) कुछ संस्करण या आईएसओ सी ++ के द्वारा परिभाषित एक stdint.h शीर्षलेख है। यह int16_t, uint64_t, आदि जैसे अच्छे प्रकार को परिभाषित करता है ... जिन्हें एक विशिष्ट आकार और प्रतिनिधित्व करने की गारंटी है। दुर्भाग्यवश, यह उपलब्धता बिल्कुल मानक नहीं है (माइक्रोसॉफ्ट विशेष रूप से यहां एक पैर ड्रैगर था)।

सरल उत्तर यह है जो हर 32 या 64 बिट बाइट-पता वास्तुकला पर काम करता है, मैं के बारे में पता कर रहा हूँ:

  • सभी चार चर 1 बाइट हैं
  • सभी लघु चर 2 बाइट्स
  • हैं
  • सभी int चर 4 बाइट
  • "लंबे" का उपयोग न करें, जो अनिश्चित आकार का है।
  • 64 बिट गणित के लिए समर्थन के साथ सभी ज्ञात कंपाइलर देशी 64 बिट प्रकार के रूप में "लंबे समय तक" अनुमति देते हैं।

, पता है कि कुछ 32 बिट compilers एक 64 बिट प्रकार बिल्कुल नहीं है रहो इतने लंबे समय के लंबे समय तक उपयोग करते हुए 64 बिट सिस्टम के लिए आप को सीमित कर देगा और compilers का एक छोटा समूह (जो जीसीसी और MSVC शामिल हैं, इसलिए सबसे लोगों को इस समस्या की परवाह नहीं होगी)। BOOST cstdint

आमतौर पर खुद पहिया (जो रखरखाव और परीक्षण पड़ता है) की खोज की तुलना में बेहतर:

+1

मैंने कुछ प्लेटफ़ॉर्म पर 'int' को 64-बिट के रूप में देखा है। 'लंबा लंबा 'सी ++ में गैर मानक है और केवल' लंबे' से बराबर या बड़ा आकार होने की गारंटी है। कुछ दुर्लभ प्रणालियों पर 'char', 16-बिट है। ये पोर्टेबल मान्यताओं को आप नहीं बना रहे हैं। यही कारण है कि Win32 या Linux-32 से 64-बिट पर पोर्ट होने पर इतना सॉफ़्टवेयर परेशानी होती है। – greyfade

+4

इस तरह की प्रतिक्रिया है कि मैंने पोर्टेबल उत्तर के साथ क्यों शुरुआत की। लेकिन मुझे खेद है, आपके पैडेंट्री में सबूत नहीं हैं। मुझे कहीं भी कोई मंच नहीं पता है जो 64 बिट्स को int परिभाषित करता है। "लंबे समय तक" वास्तव में, गैर मानक है। फिर भी यह आश्चर्यजनक है कि यह किसी भी मानक 64 बिट प्रकार की तुलना में कंपाइलरों में कहीं अधिक पोर्टेबल है; यह मुझे परेशान करता है कि लोग इसे स्वीकार करने में विफल रहते हैं। लक्ष्य पोर्टेबिलिटी है, मानक नहीं। मेरा जवाब व्यावहारिक पोर्टेबिलिटी चिंताओं के बारे में था। –

1

यदि इसका नाम दो अंडरस्कोर (__) से शुरू होता है, तो डेटा प्रकार गैर-मानक होता है।

__int8 (अहस्ताक्षरित __int8)

__int16 (अहस्ताक्षरित __int16)

__int32 (अहस्ताक्षरित __int32)

__int64 (अहस्ताक्षरित __int64)

करने की कोशिश करो का उपयोग करें boost/cstdint.hpp