2010-11-02 22 views
9

अगर मैं निम्नलिखित कोड था:में चर का दायरा सी ++

for(int myvar = 0; myvar < 10; myvar++); 
if(1) 
{ 
    int var2 = 16; 
} 

फिर, बाद में मैंने लिखा है:

myvar = 0; 
var2 = 0; 

कि कानूनी होगा? मेरा वीसी ++ 6 इसे सही तरीके से संकलित करता है, लेकिन मुझे लगता है कि यह अवैध होना चाहिए। (यह मेरे अन्य compilers में से एक में एक संकलक त्रुटि देता है।)

+4

"मेरा वीसी ++ 6 इसे सही तरीके से संकलित करता है," नहीं। – avakar

+0

@ सभी उत्तरों, मेरे पास केवल एक कंप्यूटर पर वीसी ++ 6 है; मेरे दूसरे पर, मेरे पास वीसी ++ 2008 ईई है। मुझे वीसी ++ 6 का उपयोग करने के लिए मजबूर किया गया है। :) –

उत्तर

10

VC6 बल्कि वर्ष, और हमेशा नहीं ... कठोर है ... मानक के अपने आवेदन :-) यह वास्तव में की तरह कुछ निश्चित परिस्थितियों में गुंजाइश लीक में:

for (int i = 0; i < 10; i++) { } 
// You can still use 'i' here. 

यह कुछ करने के लिए नेतृत्व इस समस्या को हल करने के लिए funky macro magic। यदि आप एक आईएसओ-अनुरूप कंपेलर का उपयोग कर रहे हैं, तो आप जो कुछ करने की कोशिश करते हैं वह अवैध हैं।

आईएसओ सी ++ 11 3.3.3/1 से, {...} साथ ब्लॉक गुंजाइश की शुरूआत के साथ काम:

एक नाम एक ब्लॉक में घोषणा की है कि ब्लॉक करने के लिए स्थानीय है, इसमें ब्लॉक गुंजाइश है। इसका संभावित दायरा इसके ब्लॉक के अंत में घोषणापत्र के अंत में शुरू होता है और समाप्त होता है।

तो for-init-statement एक घोषणा, नाम (रों) के दायरे से घोषित for-statement के अंत तक फैली हुई है:

धारा 6.5.3 एक for बयान से चर का दायरा "निर्मित" को शामिल किया गया ।

+1

मुझे लगता है कि आपका मतलब सी ++ 0x है। –

17

नहीं, यह (§3.3.2 स्थानीय गुंजाइश) नहीं होगा:

  1. एक नाम एक ब्लॉक में घोषित (6.3) उस ब्लॉक के लिए स्थानीय है। इसकी क्षमता गुंजाइश घोषणा (3.3.1) के स्थान पर शुरू होता है और इसके कथात्मक क्षेत्र के अंत में समाप्त होता है।

मैं आपको पिछले दशक में जारी संकलक का उपयोग करने की सलाह देता हूं।

1

कि कानूनी होगा? मेरा वीसी ++ 6 इसे सही तरीके से संकलित करता है, लेकिन मुझे लगता है कि यह अवैध होना चाहिए।

नहीं यह कानूनी नहीं होना चाहिए। डंप वीसी ++ 6। एक नया और बेहतर कंपाइलर का प्रयोग करें।

1

कुलपति चर छोरों और सशर्त बयान में घोषित करने के लिए उचित गुंजाइश लागू करने के लिए एक दशक के बारे में ले लिया। आम तौर पर आप सी ++ के बारे में वीसी 6 के फैसले पर भरोसा नहीं कर सकते हैं।

4

यह अवैध होना चाहिए लेकिन वीसी 6 उस पर बहुत बुरा था।

विजुअल स्टूडियो 2005 में, नामक एक नई परियोजना-स्तर सेटिंग शुरू की गई थी "फोर्स-लूप स्कोप में बल अनुरूपता"।इसने समस्या को संबोधित किया और पिछड़े संगतता भी प्रदान की। जिसका अर्थ यह है कि पुराने कोड बेस इस सेटिंग को अक्षम करने के माध्यम से विजुअल स्टूडियो के नए संस्करणों में संकलित कर सकते हैं।

हालांकि, एक चीज जिसने एमएस को डिफ़ॉल्ट रूप से चालू करने के लिए VS2005 में सही किया था, इसलिए मानकों के करीब थोड़ा सा आ रहा था।

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