यह करने के लिए (जाहिरा तौर पर यह 'अगर' नहीं बल्कि 'के लिए' के दायरे के स्तर की व्याख्या) चाहिए विजुअल सी ++ (v6.0 और इससे पहले) के पुराने संस्करणों में एक बग ठीक करें। अतीत में, विजुअल C++ चर for
बयान के अंदर घोषित के बारे में गुंजाइश नियम तोड़ा था:
// This compiles in old versions of Visual C++, but it is in fact INVALID C++
for(int i = 0; ...)
{
...
}
for(i = 0; ...)
{
}
दूसरे शब्दों में, विजुअल C++ जैसे कि वह लूप के बाहर घोषित किया गया i
एक गुंजाइश देता है, और यह आप इसे का उपयोग जारी रखने की सुविधा देता है लूप के बाद किया जाता है। यह उपरोक्त स्निपेट जैसे कोड का कारण बनता है। अधिक मानकों-अनुरूप कंपिलरों में, i
अब दूसरे for
लूप की परिभाषा पर दायरे में नहीं है, इसलिए संकलक i
को अपरिभाषित होने के बारे में त्रुटि जारी करता है।
#define for if(0) {} else for
यह बदलता है इस में for
पाश:
if(0)
{
}
else
for(int i = 0; ...)
{
...
}
इस में for
पाश डालता
इसे ठीक करने के कुछ लोगों को इस मैक्रो (या बहुत समान, बराबर मैक्रो) का इस्तेमाल किया स्कोप का एक अतिरिक्त स्तर, ताकि for
लूप में घोषित किए गए किसी भी चर के बाद विज़ुअल सी ++ की बग पर ध्यान दिए बिना, दायरे से बाहर हो जाएगा। यह सुनिश्चित करता है कि एक ही कोड विज़ुअल सी ++ और मानकों-अनुरूप कंपेलरों दोनों में सही ढंग से संकलित करता है, और यह गलत कोड सही ढंग से संकलित नहीं करता है।
भी ध्यान रखें कि यदि मैक्रो बजाय परिभाषित किया गया ताकि:
// DO NOT USE
#define for if(1) for
तब हालांकि कि कुछ सरल कोड के लिए एक ही प्रभाव होता है, यह अचानक निम्नलिखित कोड गलत तरीके से संकलित किया जा करने के लिए कारण होगा:
if(foo)
for(...)
{
...
}
else
doSomething();
क्योंकि अगर आप मैक्रो का विस्तार, तो आप इस मिल:
if(foo)
if(1)
for(...)
{
...
}
else
doSomething();
और else
अब गलत if
से मेल खाता है! तो, if(1)
के बजाय if(0) {} else
का उपयोग करने का चालाक उपयोग इस समस्या से बचाता है।
अंतिम नोट के रूप में, #define for if(0) {} else for
असीमित रिकर्सन का कारण नहीं बनता है, क्योंकि प्रीप्रोसेसर उस मैक्रो को दोबारा प्रतिस्थापित नहीं करेगा जिसे आप वर्तमान में परिभाषित कर रहे हैं। यह केवल इस मामले में एक प्रतिस्थापन करेगा।
वास्तव में अच्छा जवाब है। –
एमएस फिर से हमला! – boatcoder