2010-07-07 10 views
10

को महत्व देता है एक मूल्यआकार

रूप में परिभाषित किया गया है, तो

#define M_40 40

आकार एक short (2 बाइट्स) के रूप में ही है या एक char (1 बाइट) के रूप में यह है या int (4 बाइट्स)?

क्या आकार 32-बिट या 64-बिट पर निर्भर करता है?

+0

अपने आप में एक आकार में नहीं है या एक' int' 4 बाइट होने जा रहा है? ये केवल गारंटी देता हैं आप: http://stackoverflow.com/questions/271076/what-is-the-difference-between-an-int-and-a-long-in-c/271132#271132 – GManNickG

+0

@GMan : अच्छा लिंक .. मेरी संकलक और वातावरण में, यह 2 बाइट्स तो मैं स्पष्ट किया जाना चाहिए था धन्यवाद –

+4

यह सवाल सी ++ के साथ टैग कर रहा है .., इसलिए मुझे लगता है कि क्या में अपने प्रोग्रामिंग '# define' उपयोग करने के लिए कोई अच्छा कारण नहीं है है। सी ++ में इस तरह की चीज के लिए। बस 'const int m_40 = 40;' लिखें और इसके साथ किया जाए। फिर आप आकार के बारे में देखभाल करते समय 'int' से 'छोटा' या 'char' या जो कुछ भी आपको पसंद करते हैं उसे बदल सकते हैं। साथ ही, नामित स्थिरांक के बिंदु को गायब करना अगर निरंतर नाम सिर्फ मूल्य है। 'Foo (M_40)' लिखना 'foo (40) 'से अधिक अर्थ में बिल्कुल स्पष्ट नहीं है। –

उत्तर

28

#define का कोई आकार नहीं है क्योंकि यह एक प्रकार का नहीं है बल्कि आपके सी ++ कोड में सादा पाठ प्रतिस्थापन है। #define एक प्रीप्रोसेसिंग निर्देश है और यह आपके कोड को संकलित होने से पहले भी चलता है।

प्रतिस्थापन के बाद सी ++ कोड में आकार जो भी है, उसका आकार सी ++ अभिव्यक्ति या कोड है जो आपके पास है। उदाहरण के लिए यदि आप L102L की तरह प्रत्यय करते हैं तो यह लंबे समय तक देखा जाता है, अन्यथा कोई प्रत्यय नहीं, केवल एक int। तो x86 और x64 पर 4 बाइट्स शायद, लेकिन यह संकलक निर्भर है।

कोई पूर्णांक शाब्दिक के प्रकार के अपने फार्म पर निर्भर करती है:

शायद सी ++ मानक के पूर्णांक शाब्दिक खंड इसके लिए आप (धारा 03 सी ++ मानक का 2.13.1-2) स्पष्ट होगा , मूल्य, और प्रत्यय। यदि यह दशमलव है और इसमें कोई प्रत्यय नहीं है, तो इन प्रकारों में से पहला है जिसमें मान का प्रतिनिधित्व किया जा सकता है: int, long int; यदि मान एक लंबे int के रूप में प्रतिनिधित्व नहीं किया जा सकता है, तो व्यवहार अपरिभाषित है। पूर्णांक, अहस्ताक्षरित int, लंबे पूर्णांक, अहस्ताक्षरित लंबे पूर्णांक: यदि यह अष्टाधारी है या हेक्साडेसिमल और कोई प्रत्यय है, यह इन प्रकार जिसमें अपने मूल्य दर्शाया जा सकता है की पहली है। यदि यह यू या यू द्वारा पर्याप्त है, तो प्रकार में इन प्रकारों में से पहला है जिसका मूल्य प्रदर्शित किया जा सकता है: बिना हस्ताक्षर किए गए int, unsigned long int। यदि यह एल या एल द्वारा प्रत्ययित है, तो इसका प्रकार इन प्रकारों में से पहला है जिसमें मान का प्रतिनिधित्व किया जा सकता है: लंबा int, बिना हस्ताक्षर किए गए लंबे int। यह उल, लू, यूएल, लू, उल, लू, यूएल, या LU, द्वारा प्रत्यय है, तो अपने प्रकार अहस्ताक्षरित लंबा है पूर्णांक

+1

इच्छा है कि मैं मानक उद्धरण के लिए एक बार फिर +1 कर सकता हूं, बहुत उपयोगी। – GManNickG

7

एक सादे पूर्णांक परोक्ष सभी गणना में int लिए डाली जा रहा है और असाइनमेंट्स।

#define बस प्रीप्रोसेसर को सभी संदर्भों को किसी अन्य चीज़ के साथ किसी संदर्भ में बदलने के लिए कहता है। यह आपके कोड पर वैश्विक खोज-प्रतिस्थापन करने और M_40 को 40 के साथ बदलने जैसा ही है।

+0

+1 वैश्विक खोज-प्रतिस्थापन सबसे स्पष्ट, सबसे नौसिखिया-अनुकूल स्पष्टीकरण –

2

ए # डिफाइन मूल्य का कोई आकार नहीं है, विशेष रूप से। यह सिर्फ पाठ प्रतिस्थापन है। यह इस संदर्भ पर निर्भर करता है कि (और क्या) प्रतिस्थापित किया जा रहा है।

अपने उदाहरण में, जहां आप M_40 का उपयोग करते हैं, संकलन 40 देखेंगे, और आमतौर पर इसे int में मानते हैं।

हालांकि, अगर हम था:

void SomeFunc(long); 

SomeFunc(M_40); 

यह एक लंबे समय के रूप में माना जाएगा।

+1

आमतौर पर हमेशा नहीं होता है। और निरंतर '40' अभी भी आपके उदाहरण कोड में 'int' होगा। हालांकि, फ़ंक्शन को कॉल करने पर मान '40' को 'लंबे' तक प्रचारित किया जाएगा। लेकिन '40' स्थिर अभी भी एक 'int' है। – GManNickG

+0

@GMan: यह अभी भी एक int क्यों है, भले ही यह एक साधारण 1-बाइट चार हो सकता है? संपादित करें (हाँ मुझे पता है कि चार आवश्यक नहीं है 1-बाइट) –

+0

@GMan: #define एल (एक्स) एक्स ## एल एल (एम_40) अब यह एक लंबा है। # परिभाषित एस (एक्स) # एक्स एस (एम_40) अब यह एक char * है, यही कारण है कि मैंने "आमतौर पर" कहा। –

1

पूर्वप्रक्रमक तो तथ्य यह है कि अपने लगातार एक #define में है कोई फर्क नहीं पड़ता, बस, साधारण पाठ प्रतिस्थापन है। सभी सी मानक कहते हैं कि "प्रत्येक निरंतर एक प्रकार का होगा और निरंतर का मान इसके प्रकार के लिए प्रतिनिधित्व योग्य मानों की सीमा में होगा।" सी ++ उस से बहुत अलग नहीं होने की संभावना है।

+0

आगे बढ़ते हुए, सी ++ ने मूल्य के बजाय 'int' में मूल्य डाला, जब 40 स्वीकार्य मान है उदाहरण के लिए, हस्ताक्षर किए गए चार के बाद से यह 0 और 255 के बीच है? –

+3

@Changeling: सी ++ मानक नियमों के आधार पर। –

2

प्रीप्रोसेसर मैक्रो सचमुच संकलन की preprocess चरण के दौरान में बदली मिलता है।

जब संकलक इसे देखता है उदाहरण के लिए कोड

#define N 5 

int value = N; 

के लिए

int value = 5; 

बदली हो जाएगा। यह कौन कहता है कि एक `short` 2 बाइट्स होने जा रहा है के रूप में इस तरह के

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