टी एल; डॉ
एकमात्र तरीका यह है कि आप किसी मामले के अंदर एक इंटेस्टाइज़र या कुछ गैर-तुच्छ वस्तु के साथ एक चर घोषित कर सकते हैं एक ब्लॉक स्कोप का उपयोग करके {}या अन्य नियंत्रण संरचना का परिचय दे सकता है जिसमें लूप या यदि स्टेटमेंट की तरह खुद का स्कोप है ।
Gory विवरण
हम देख सकते हैं कि केस सिर्फ लेबल स्टेटमेंट हैं जैसे कि किसी गोटो स्टेटमेंट के साथ इस्तेमाल किए गए लेबल ( यह C ++ ड्राफ्ट स्टैंडर्ड सेक्शन 6.1 लेबल स्टेटमेंट में कवर किया गया है ) और हम सेक्शन पैराग्राफ 3 से देख सकते हैं कि जम्पिंग पास एक घोषणा कई मामलों में अनुमति नहीं है। , जिनमें एक आरंभीकरण शामिल है:6.7
एक ब्लॉक में स्थानांतरित करना संभव है, लेकिन इस तरह से नहीं कि प्रारंभिककरण के साथ घोषणाओं को बायपास करें। एक प्रोग्राम जो 87 से एक बिंदु पर कूदता है जहां एक स्वचालित भंडारण अवधि वाला चर एक बिंदु के दायरे में नहीं होता है, जहां यह स्कोप होता है, जब तक कि चर स्केलर प्रकार नहीं होता है, वर्ग प्रकार एक तुच्छ डिफ़ॉल्ट निर्माता और एक तुच्छ डिस्ट्रक्टर के साथ होता है। इन प्रकारों में से एक का एक cv- योग्य संस्करण, या पूर्ववर्ती प्रकारों में से एक का एक सरणी और एक इनिशलाइज़र (8.5) के बिना घोषित किया गया है।
और यह उदाहरण प्रदान करता है:
void f() {
// ...
goto lx; // ill-formed: jump into scope of a
ly:
X a = 1;
// ...
lx:
goto ly; // OK, jump implies destructor
// call for a followed by construction
// again immediately following label ly
}
ध्यान दें, यहां कुछ सूक्ष्मताएं हैं, आपको एक स्केलर घोषणा को पिछले करने की अनुमति दी गई है जिसमें एक आरंभीकरण नहीं है, उदाहरण के लिए:
switch( n )
{
int x ;
//int x = 10 ;
case 0:
x = 0 ;
break;
case 1:
x = 1 ;
break;
default:
x = 100 ;
break ;
}
पूरी तरह से मान्य है ( लाइव उदाहरण )। बेशक, यदि आप प्रत्येक मामले में एक ही चर घोषित करना चाहते हैं, तो उन्हें प्रत्येक को अपने स्वयं के दायरे की आवश्यकता होगी लेकिन यह स्विच स्टेटमेंट के बाहर भी उसी तरह से काम करता है , ताकि कोई बड़ा आश्चर्य न हो।
छलांग लगाने की अनुमति नहीं देने के लिए औचित्य के अनुसार , दोष रिपोर्ट 467 हालांकि थोड़ा अलग मुद्दे को कवर करने के लिए स्वचालित चर के लिए एक उचित मामला प्रदान करता है :
[...] स्वचालित चर, यदि स्पष्ट रूप से आरंभिक नहीं हैं, तो ट्रैप अभ्यावेदन सहित अनिश्चित ("कचरा") मान हो सकते हैं, [...]
इस मामले को देखने के लिए शायद अधिक दिलचस्प है जहां आप कई मामलों में एक स्विच के भीतर एक गुंजाइश का विस्तार करते हैं, इसका सबसे प्रसिद्ध उदाहरण संभवतः डफ का उपकरण है जो कुछ इस तरह दिखाई देगा:
void send( int *to, const int *from, int count)
{
int n = (count + 7) / 8;
switch(count % 8)
{
case 0: do { *to = *from++; // <- Scope start
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while(--n > 0); // <- Scope end
}
}