निम्नलिखित सी ++ उदाहरण जीसीसी या बजना के साथ संकलित करने के लिए विफल रहता है, लेकिन केवल आईसीसी के साथ एक चेतावनी उत्पन्न करता है, और कुछ भी नहीं सब पर MSVC के साथ की आरंभीकरण:त्रुटि: कूद 'foo' लेबल करने के लिए पार करती है 'बार'
int main(int argc, char *argv[])
{
if (argc < 2)
goto clean_up;
#if 1 // FAIL
int i = 0;
#elif 0 // workaround - OK
{
int i = 0;
}
#else // workaround - OK
int i;
i = 0;
#endif
clean_up:
return 0;
}
जी ++:
init.cpp:13: error: jump to label ‘clean_up’
init.cpp:4: error: from here
init.cpp:7: error: crosses initialization of ‘int i’
बजना ++:
init.cpp:4:9: error: cannot jump from this goto statement to its label
goto clean_up;
^
init.cpp:7:9: note: jump bypasses variable initialization
int i = 0;
^
आईसीसी:
init.cpp(4): warning #589: transfer of control bypasses initialization of:
variable "i" (declared at line 7)
goto clean_up;
^
मैं त्रुटि का कारण समझता हूं, और इस तरह के एक साधारण उदाहरण के लिए यह काम करना काफी आसान है (मैंने ऊपर दिए गए उदाहरण में कुछ संभावित कामकाज शामिल किए हैं), लेकिन मैं काम कर रहा हूं एक बड़ा क्रॉस-प्लेटफार्म विरासत कोड बेस जो त्रुटि-हैंडलिंग मैक्रोज़ के साथ मिर्च किया जाता है जो समान goto
निर्माण का उपयोग करता है। एमएसवीसी या आईसीसी के साथ काम करने वाले अन्य डेवलपर्स इनलाइन प्रारंभिकरणों को शुरू करते रहते हैं जो बाद में जीसीसी या क्लैंग बिल्ड के लिए त्रुटियों में पड़ते हैं (और निश्चित रूप से वे एमएसवीसी/आईसीसी के साथ प्राप्त चेतावनियों को अनदेखा करते हैं)।
तो मुझे या तो (ए) इस तरह के मामलों को आईसीसी/एमएसवीसी पर त्रुटियों के परिणामस्वरूप या बी (बी) जीसीसी/क्लैंग के साथ चेतावनियों को कम करने के लिए एक रास्ता खोजने की जरूरत है। मैंने -fpermissive
जीसीसी के साथ कोशिश की लेकिन यह मदद नहीं प्रतीत होता है।
अतिरिक्त क्रेडिट मैं भी सरल अदिश initialisation के लिए इस त्रुटि के पीछे तर्क के रूप में उत्सुक हूँ के लिए - मैं क्यों एक निर्माता ऊपर से कूदते समस्याग्रस्त किया जा सकता है, लेकिन ऊपर के उदाहरण में के रूप में एक
int
initialising प्रतीत नहीं होता देख सकते हैं जैसे कि यह कभी भी एक मुद्दा हो सकता है, और बस परिभाषा को विभाजित करना + परिभाषा में प्रारंभिकता + असाइनमेंट त्रुटि को दूर कर देता है?
सी में, यह अनुमति है (हालांकि फहरा हुआ)। सी ++ के बारे में निश्चित नहीं है। – Bathsheba
डेवलपर्स को अपनी संकलक चेतावनियों को भी ठीक करना चाहिए, न केवल त्रुटियों। – Melebius
@ बाथशेबा: हाँ, ये विरासत मैक्रोज़ मूल रूप से सी कोड बेस से आते हैं, लेकिन अब सी ++ कोड का तेजी से उपयोग किया जा रहा है और मैं इस समस्या की प्रत्येक नई घटना को ठीक करना जारी रखता हूं। –