2010-07-20 11 views
18

यह कोड क्यों अमान्य है?टाइपपीफ और गैर-साधारण प्रकार विनिर्देश

typedef int INT; 
unsigned INT a=6; 

जबकि निम्नलिखित कोड मान्य

typedef int INT; 
static INT a=1; 

है?

मेरी समझ के अनुसार unsigned int"simple type specifier" नहीं है और इसलिए कोड खराब है। हालांकि मुझे यकीन नहीं है।

कोई भी Standard के प्रासंगिक खंड को इंगित कर सकता है जो पहले कोड को अमान्य बनाता है (और दूसरा कोड मान्य)?

संपादित

हालांकि Johannes Schaub's जवाब सही और बात करने के लिए लग रहा था (वह अपने उत्तर हटा दिया गया था BTW) मैं इसकी सत्यता और यथातथ्यता के लिए जेम्स कुरान का जवाब स्वीकार कर लिया।

+0

जिज्ञासा से, आप ऐसा क्यों करेंगे? उस पुनर्वितरण के लिए बहुत अधिक कारण नहीं है। 'typedef unsigned int UINT; 'अधिक समझ में आ सकता है, हालांकि .... – JAB

+1

हाँ जेएबी मुझे पता है कि, वास्तव में मैं इस तरह के कोड को व्यावहारिक रूप से कभी नहीं लिखूंगा। हालांकि मैं उत्सुक हूं कि पहला कोड क्यों काम नहीं करता है? तो सवाल को 'भाषा-वकील' भी टैग किया गया है। –

+0

मुझे पता है कि यह प्राथमिक विषय नहीं है, लेकिन आप "std :: make_unsigned :: टाइप" लिख सकते हैं (देखें http://msdn.microsoft.com/en-us/library/ee361636.aspx?ppud=4) – Tomaka17

उत्तर

29

typedef रों मैक्रो की तरह नहीं हैं (अहस्ताक्षरित चार, लंबे, लघु, या पूर्णांक के साथ जोड़ा जा सकता है)। वे सिर्फ पाठ प्रतिस्थापन नहीं हैं। एक Typedef एक नया टाइपनाम बनाता है।

अब जब आप unsigned int कहते हैं, unsigned एक संशोधक नहीं है जिसे int पर लगाया जाता है। unsigned int पूर्ण टाइपनाम है; इसमें बस एक जगह होती है।

तो, जब आप typedef int INT; कहते हैं तो INT पूर्ण टाइपनाम है। इसे संशोधित नहीं किया जा सकता है।

static (जैसे const) एक स्टोरेज क्लास विनिर्देशक है। यह वास्तव में प्रकार के नाम का हिस्सा नहीं है।

+1

सी ++ 0x मानक खंड 3.9.1 अनुच्छेद 3 हस्ताक्षरित अभिन्न प्रकार सूचीबद्ध करता है और आपके उत्तर का समर्थन करता है। 'हस्ताक्षरित int' एक प्रकार है जिसमें नाम में एक स्थान है। 'हस्ताक्षरित' को किसी अन्य प्रकार के संशोधक के रूप में सूचीबद्ध नहीं किया गया है ताकि इसे जादुई रूप से गैर-नकारात्मक बनाया जा सके। –

12
  • 7.1.1: स्थैतिक एक भंडारण वर्ग विनिर्देशक है। इसे किसी भी प्रकार से पहले रखा जा सकता है।
  • 7.1.5: क्या एक प्रकार निर्दिष्टकर्ता है
+3

'हस्ताक्षरित' भी एक प्रकार का एक प्रकार हो सकता है। – torak

+0

और अंतर्निहित int टाइप – Scharron

+0

+1 योग्यता से योग्य नहीं है, लेकिन सही है और यदि उसे मानक के बारे में कोई जानकारी है, तो मुझे संदेह है कि इन अनुभाग संख्याओं की मदद मिलेगी। –

2

यह मत भूलना कि टाइपिफ-आईएनजी मैक्रो-डिफ़ाइनिंग की तरह नहीं है; आपके उदाहरण में, ऐसा लगता है जैसे आपको लगता है कि आपका आईएनटी एक शाब्दिक int की तरह देखा जाना चाहिए। कंपाइलर बिंदु दृश्य से, टाइपपीफ टाइप-उपनाम परिभाषित करता है, लेकिन यह "वाक्यविन्यास" स्तर पर नहीं देखा जाता है (टाइपपीफ-एड प्रकार सिंटैक्स स्तर पर "मूल" प्रकार की तरह हैं); और चूंकि उस स्तर पर बिना किसी छोटे से छोटे या int से पहले हस्ताक्षर किए जाने की अनुमति है, तो unsigned INTunsigned से पहले "प्रकार" ("अलग," छोटा, छोटा, int) से "अलग" ("अलग" जैसा दिखाई देता है।

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