2010-04-06 11 views
14

संभव डुप्लिकेट:
Why can’t I use sizeof in a preprocessor condition ?sizeof जाँच हो रही है पूर्वप्रक्रमक में एक पूर्णांक प्रकार

मैं कैसे जी के तहत पूर्वप्रक्रमक में एक unsigned के आकार की जाँच कर सकते ++? sizeof प्रश्न से बाहर है क्योंकि इसे प्रीप्रोकैसिंग के दौरान परिभाषित नहीं किया गया है।

+0

यह अच्छी तरह से उत्तर नहीं दिया गया है। – myahya

+2

@ लुसेरो: यह केवल जवाब देता है कि इस सवाल का आकार क्यों है कि मायाह्या के बारे में पता है। – UncleBens

+0

शायद http://stackoverflow.com/questions/1505582/determining-32-vs-64-bit-in-c आपके प्रश्न को कवर करता है? –

उत्तर

25

यह सबसे खूबसूरत तरीका नहीं हो सकता है, लेकिन एक बात है कि आप का लाभ उठाने में सक्षम हो सकता UINT_MAX "limits.h" में परिभाषित किया गया है। यही कारण है, ...

अगर UINT_MAX == 65535, तो आप उस sizeof (अहस्ताक्षरित) = 2

अगर UINT_MAX == 4294967295, तो आप उस sizeof पता होगा (अहस्ताक्षरित) = 4

पता होगा

और इसी तरह।

जैसा कि मैंने कहा, सुरुचिपूर्ण नहीं, लेकिन यह प्रयोज्य के कुछ स्तर प्रदान करना चाहिए।

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

+1

यह एक वैध उत्तर है जो "डुप्लिकेट" प्रश्न में नहीं है। तो, मैंने फिर से खोलने के लिए मतदान किया है। –

+1

पूर्वप्रक्रमक कुछ गणित, जैसे '#if UINT_MAX >> 8 == 0 // 1 byte' ...' UINT_MAX #elif >> 16 == 0 // दो bytes' आदि कुछ करने के लिए सक्षम होना चाहिए? – UncleBens

+3

तकनीकी तौर पर पूर्णांक के आकार बड़ा इस तकनीक की भविष्यवाणी की तुलना में, के बाद से 'unsigned' गद्दी बिट्स के लिए अनुमति दी है, या छोटा होना के बाद से CHAR_BIT 8. होने की जरूरत नहीं तो शुद्धता के लिए यह भी कहीं जोर देते हुए (एक परीक्षण में लायक हो सकता है हो सकता है, शायद), कि 'sizeof' आकार अपेक्षित देता है। अभ्यास में आप उच्च आत्मविश्वास के साथ कह सकते हैं कि ऐसा होने वाला नहीं है। –

9

स्पार्की के जवाब के आधार पर, यहाँ एक तरीका है कि एक सा अच्छे (स्पष्ट संख्या को नष्ट करने से) लगेगा

#include <limits.h> 
#include <stdint.h> 

//Check if size if 4bytes 
#if UINT_MAX == UINT32_MAX 

.... 

#endif 

<limits.h>INT_MAX परिभाषित करता है और <stdint.h> को परिभाषित करता है UINT32_MAX है। आम तौर पर, <stdint.h> निर्दिष्ट चौड़ाई के साथ पूर्णांक प्रकार देता है।

+0

यह जीसीसी के तहत काम करता है, जी ++ के तहत यह समस्याग्रस्त हो सकता है। स्पार्की का समाधान अधिक सामान्य है – myahya