2010-11-25 17 views
7

ठीक है, यह वास्तव में एक सवाल ..घोषणा चर/मामले

मैं सिर्फ कभी-कभी बाहर पाया है एक स्विच/मामला ब्लॉक के अंदर स्थानीय चर घोषित करने के लिए एक दिलचस्प तरीके से बनाया जा सकता है नहीं है। हर मामले ब्लॉक के अंदर ब्रेसिज़ का उपयोग कर के बजाय, आप लिख सकते हैं:

switch (action) { 
    int res; 
    int value; 
case ACTION_OPEN: 
    res = open(...); 
    ... 
    break; 
case ... 
} 

तो, मैं सिर्फ आश्चर्य है कि क्या जीसीसी समर्थन के अलावा C/C++ compilers इस निर्माण? यह एक आम गिरावट के समान दिखता है। इस निर्माण पर कोई टिप्पणी स्वागत है!

+0

+1, यह पता लगाने के लिए कि क्या यह कानूनी सी ++ है या संकलक का दुर्घटना है। अगर इसकी अनुमति है तो उपयोगी हो सकता है। –

+0

11+ वर्षों से पुराने सी संकलक का उपयोग करना बंद करना एक आसान तरीका है। –

+0

फिर भी, कभी-कभी गिरावट को छोड़कर, मैं अब भी स्थानीय स्कोपिंग के लिए प्रत्येक केस ब्लॉक के अंदर ब्रेसिज़ पसंद करता हूं। यह स्वाद का मामला है। – stefaanv

उत्तर

1

कोई मानक-अनुरूप सी या सी ++ कंपाइलर इसकी अनुमति देगा। यहां तक ​​कि एक पुराने फैशन (प्री-आईएसओ सी 99) सी कंपाइलर भी इसकी अनुमति देगा, लेकिन केवल इसलिए कि परिवर्तनीय घोषणाएं ब्लॉक/कंपाउंड स्टेटमेंट ({} द्वारा निर्दिष्ट) की शुरुआत में हैं।

ध्यान दें कि क्या एक switch इस प्रकार लगभग एक सामान्य बयान है, मामले लेबल की संभावना के अलावा:

int main(int argc, char* argv[]) 
{ 
    switch (argc) 
     default: 
     puts("Hello, world!"); 

    return 0; 
} 

तो एएनएसआई C89 में, यह ब्रेसिज़ कि जादू यहां करते हैं।

3

स्विच बॉडी सिर्फ एक सामान्य कथन है (आपके मामले में एक कंपाउंड स्टेटमेंट, { ... } जैसा दिख रहा है) जिसमें कोई बकवास हो सकता है। केस लेबल सहित।

इस स्विच दर्शन का दुरुपयोग Duffs device द्वारा किया गया है।

कई लोगों को यह एहसास नहीं है कि switch(0) ; जैसे कुछ भी एक वैध कथन है (यौगिक बयान होने के बजाय, यह शरीर के रूप में एक शून्य बयान है), हालांकि काफी बेकार है।

+0

इसमें परिवर्तनीय घोषणाओं के साथ कुछ लेना देना नहीं है। डफ ने अपने 'स्विच' कथन के अंदर चर घोषित नहीं किया था, क्योंकि उसके दिन के सी कंपाइलर्स को अतिरिक्त ब्लॉक की आवश्यकता होती थी (जिसे शायद पुश/पॉप निर्देशों में अनुवादित किया गया होगा)। –

+3

@ लार्समैन डफ के डिवाइस में परिवर्तनीय घोषणाओं के साथ कुछ लेना देना नहीं है, लेकिन सी और सी ++ द्वारा नियोजित स्विच स्ट्रक्चर का दुरुपयोग करने के लिए इसका सब कुछ है। विशेष रूप से, उस मामले के लेबल वास्तव में कुछ भी "विशेष" नहीं हैं बल्कि बस लेबल कूदते हैं। एक बार यह ज्ञात हो जाने पर, यह आश्चर्य की बात नहीं है कि आप स्विच बॉडी में लेबल के मामले में घोषणा बयान दे सकते हैं। –

-1

मुझे लगता है कि सी 99 ब्लॉक के अंदर कहीं भी वैरिएबल (लगभग) घोषित करने की अनुमति देता है, ताकि व्यवहार को कानूनी माना जाना चाहिए .. और मुझे कोई वास्तविक जोखिम नहीं दिख रहा है क्योंकि यह सिर्फ एक घोषणा है।

0

कड़ाई से बोली जाने वाली स्थिति, जो आप int के साथ पेश करते हैं, वह सभी तीन भाषाओं में अनुमति है, लेकिन विभिन्न कारणों से।

सी किसी भी स्थानीय चर (अंकगणित, struct, union, सरणी ...) के सभी मामलों में (सी 8 9 के लिए) और सभी मामलों में लेकिन एक (सी 99 के लिए) की परिभाषा में कूदने की अनुमति देता है। सी 99 के लिए अपवाद परिवर्तनीय लंबाई सरणी हैं।

सी ++ केवल उन डेटा प्रकारों के लिए अनुमति देता है जिनमें कोई कन्स्ट्रक्टर या विनाशक नहीं होता है, जिसे अक्सर पीओडी कहा जाता है।

तो अगर आप C89 में अपने उदाहरण में एक प्रकार T बजाय int है यह हमेशा मान्य है, और C99 और C++ यह प्रकार T या नहीं, यह सही है पर निर्भर करता है।

किसी भी मामले में, यह सब आसानी से अनियमित चर की ओर जाता है, इसलिए यदि आप इससे बच सकते हैं तो बेहतर न करें।

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