मैं इस 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) खुश करता है।
दिलचस्प बात यह है कि कोड gcc-4.3.4 पर ठीक से संकलित और चलाने के लिए प्रतीत होता है: http://ideone.com/n1bmIb संपादित करें: आह .. लेकिन केवल सी ++ के रूप में, सी – GrahamS