2013-08-08 31 views
13

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

मैं यह पता लगाने की कोशिश कर रहा हूं कि क्या निम्नलिखित कोड को अनुमति देने का एक उद्देश्य है, या यदि यह केवल उन चीजों में से एक है जहां "इसे प्रतिबंधित करने के लिए यह अधिक काम है, इसलिए इसकी अनुमति है"।

#include <iostream> 
void foo() { 
    std::cout << "foo" << std::endl; 
} 

int main() 
{ 
    for (int a = -10; a < 10; ++a) 
    { 
     switch(a) 
     { 
     foo(); 
     case 4: 
     std::cout << "4" << std::endl; 
     } 
    } 
} 

यह अब आउटपुट "4" के रूप में उम्मीद है जब एक == 4, और यह foo आउटपुट कभी नहीं। तो सवाल यह है कि, पहले मामले से पहले foo(); स्टेटमेंट को अनुमति देने के लिए कुछ (संभावित रूप से गूढ़ लेकिन उपयोगी) कारण हैं? मुझे यकीन है कि मुझे वहां घोषित करने और वैरिएबल शुरू करने की अनुमति नहीं है।

(Fwiw, मैं इस कई compilers पर परीक्षण किया गया है, और वे सभी एक ही व्यवहार उपज रहे हैं। हैरानी की बात है, वे भी सब नहीं उत्पादन एक चेतावनी है।)

+2

यह क्या संकलक है? – turnt

+0

मैंने एमएसवीसी 2012 और जीसीसी 4.8.1 दोनों पर इसका परीक्षण किया है। – Shirik

+0

हम्म दिलचस्प। एक विचार जो दिमाग में आता है उसे डिफ़ॉल्ट लिखना नहीं है: और इसके बजाय अंतिम मामले के नीचे कोड लिखना। लेकिन, यह संभावित बुरी प्रथा चिल्लाता है :) –

उत्तर

8

हाँ, व्यवहार में बनाया गया है के रूप में भाषा और आप विभिन्न स्थानों में कोड जोड़ सकते हैं। स्विच कथन देखने से कहीं अधिक जटिल हैं, और वे काफी गूढ़ कोड की अनुमति देते हैं, भले ही यह समझ में आता है या नहीं।

आप कुछ समय बिताने के switch की कुछ अजीब उपयोग करता है और मामलों के स्थान को देख चाहते हैं, आप को बढ़ावा देने asio पुस्तकालय में coroutines के कार्यान्वयन पर देख सकते हैं। आप मैक्रोज़ के साथ एक छोटा सा फ़ंक्शन लिख सकते हैं, संकलित कर सकते हैं और देख सकते हैं कि जेनरेट कोड (मैक्रो विस्तार के बाद) कैसा दिखता है।

+0

बूस्ट का कार्यान्वयन आम तौर पर मुझे डराता है, लेकिन अब आपने मेरी जिज्ञासा पिक्चर की है। – Shirik

+4

@ शिरिक स्विच-सॉर्केरी का कैनोलिक उदाहरण है [डफ का डिवाइस] (http://en.wikipedia.org/wiki/Duff's_device): एक स्विच-डू-टाइम के साथ एक स्विच। – TemplateRex

+0

निंजाड। मुझे खुशी है कि किसी ने डफ के डिवाइस का उल्लेख किया है। मैं (शायद ही कभी) लंबे कार्यों को तोड़ने और उन्हें पुनरारंभ करने में आसान बनाने के लिए एम्बेडेड सिस्टम पर इस तरह की जादूगर का उपयोग करता हूं। लेकिन, अगर आप 'गेटो' का उपयोग करते समय गंदे महसूस करते हैं तो आपको इस तरह के प्रवेश बिंदु के लिए स्विच का उपयोग करने से पहले शायद अतिरिक्त कठिन सोचना चाहिए। – Speed8ump

3

MSDN से: -

घोषणाएं यौगिक बयान बनाने स्विच शरीर के सिर पर दिखाई दे सकता है, लेकिन initializations घोषणाओं में शामिल प्रदर्शन नहीं कर रहे हैं। स्विच स्टेटमेंट प्रारंभिकताओं वाली रेखाओं को छोड़कर, शरीर के भीतर निष्पादन योग्य कथन को सीधे पर नियंत्रण स्थानांतरित करता है।

+3

मैं एमएसडीएन * स्रोत * को कॉल नहीं करूंगा, अगर मानक मानक * * स्रोत होगा। –

+0

हाँ, मैंने सी ++ मानक पर एक नज़र डाली, लेकिन बहुत दूर नहीं मिली। मैंने जो कुछ किया वह सब साबित हुआ कि ऐसा कुछ भी प्रतिबंधित नहीं लगता है। यह उन लोगों में से एक है जो "नियम की कमी के कारण अनुमति" चीजों में से एक है। – Shirik

+0

@MadScienceDreams: यह गैरकानूनी है क्योंकि एक्स का प्रारंभिकरण केस स्टेटमेंट द्वारा छोड़ा जाता है। – Shirik

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