2009-11-11 13 views
27

मैं इस SO question पर देख रहा था और # डिफेंस बनाम कॉन्स इट्स के बारे में सोचने लगा और महसूस किया कि मैं वास्तव में समझ नहीं पा रहा हूं कि संकलक इस से निपट नहीं सकता है। किसीजीसीसी एक कॉन्स int को केस अभिव्यक्ति के रूप में क्यों अनुमति नहीं देता है?

error: case label does not reduce to an integer constant 

में क्यों निम्नलिखित कोड को

const int FOO = 10; 

int main(int argc, char** argv) 
{ 
    switch(argc) 
    { 
     case FOO: { printf("foo\n"); } 
     default: { printf("default\n"); } 
    } 
} 

परिणाम के रूप में कुछ प्रकाश डाला सकता है मैं आईएसओ C99 कल्पना जो 6.8.4.2.3 में कहा गया है पढ़ा है कि

प्रत्येक केस लेबल की अभिव्यक्ति एक पूर्णांक निरंतर अभिव्यक्ति होगी और मामले में से कोई भी दो स्विच में निरंतर अभिव्यक्ति नहीं होगी कथन के बाद रूपांतरण के बाद मूल्य होगा।

मुझे समझ में आता है कि केस अभिव्यक्ति स्थिर क्यों होनी चाहिए, लेकिन क्यों नहीं केवल एक शाब्दिक संकलक (जीसीसी 4.2.1) खुश करता है।

+0

दिलचस्प बात यह है कि कोड gcc-4.3.4 पर ठीक से संकलित और चलाने के लिए प्रतीत होता है: http://ideone.com/n1bmIb संपादित करें: आह .. लेकिन केवल सी ++ के रूप में, सी – GrahamS

उत्तर

26

एक निरंतर अभिव्यक्ति एक कॉन्स्ट-क्वालिफाइड प्रकार मान के समान नहीं है, भले ही तकनीकी रूप से मूल्य case कथन के बिंदु पर संकलक द्वारा ज्ञात हो।

कल्पना करें कि क्या होगा यदि किसी अन्य फ़ाइल ने extern const int FOO घोषित किया और इसे उसी तरह उपयोग करने का प्रयास किया। कंपाइलर नहीं जानता कि FOO क्या था क्योंकि इसे किसी अन्य फ़ाइल में परिभाषित किया गया था। भले ही इसमें स्थिर मान है, यह स्थिर अभिव्यक्ति नहीं है।

+2

आह नहीं। बाहरी उदाहरण के लिए धन्यवाद। सुपर स्पष्ट – nall

+13

'बाहरी' उदाहरण किसी भी चीज को स्पष्ट नहीं करता है और वास्तव में कुछ भी समझाता नहीं है। सी ++ भाषा में आप सी में की तरह 'बाहरी' स्थिर भी घोषित कर सकते हैं, फिर भी सी ++ में निरंतर अभिव्यक्तियों में 'कॉन्स्ट int' ऑब्जेक्ट्स का उपयोग करना पूरी तरह से कानूनी है, जिसमें केस लेबल (बिल्कुल 'बाहरी' नहीं हैं) शामिल हैं। मूल प्रश्न का एकमात्र सही जवाब यह है कि यह ऐतिहासिक रूप से इस तरह से किया गया था। सी में बहुत शुरुआत से "स्थिर" शब्द का अर्थ शाब्दिक संख्यात्मक मान था, न कि 'const' ऑब्जेक्ट्स। क्यूं कर? सिर्फ इसलिए कि। – AnT

+1

खैर, बाहरी उदाहरण वह था जिसे मैं नहीं कर सका क्योंकि संकलक इसका सामना नहीं कर सका। आपकी टिप्पणी मूल्यवान है, यद्यपि। धन्यवाद। – nall

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

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