2015-07-20 9 views
6

निम्नलिखित सी ++ उदाहरण जीसीसी या बजना के साथ संकलित करने के लिए विफल रहता है, लेकिन केवल आईसीसी के साथ एक चेतावनी उत्पन्न करता है, और कुछ भी नहीं सब पर 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 प्रतीत नहीं होता देख सकते हैं जैसे कि यह कभी भी एक मुद्दा हो सकता है, और बस परिभाषा को विभाजित करना + परिभाषा में प्रारंभिकता + असाइनमेंट त्रुटि को दूर कर देता है?

+0

सी में, यह अनुमति है (हालांकि फहरा हुआ)। सी ++ के बारे में निश्चित नहीं है। – Bathsheba

+1

डेवलपर्स को अपनी संकलक चेतावनियों को भी ठीक करना चाहिए, न केवल त्रुटियों। – Melebius

+0

@ बाथशेबा: हाँ, ये विरासत मैक्रोज़ मूल रूप से सी कोड बेस से आते हैं, लेकिन अब सी ++ कोड का तेजी से उपयोग किया जा रहा है और मैं इस समस्या की प्रत्येक नई घटना को ठीक करना जारी रखता हूं। –

उत्तर

2

त्रुटि के रूप में चेतावनी का इलाज करने के लिए एमएसवीसी ध्वज /we n है जहां n चेतावनी की संख्या है।

For example, /we4326 flags warning number C4326 as an error.

विवरण के लिए https://msdn.microsoft.com/en-us/library/thxezb7y.aspx देखें।

+0

बंद करें - ऐसा लगता है कि 'C2362' उपयुक्त चेतावनी/त्रुटि होगी, लेकिन 'cl' तब तक उत्पन्न नहीं होता है जब तक कि आप ऐसा लगता है कि'/Za' ऐसा नहीं होता है, इस स्थिति में यह किसी भी तरह की त्रुटि है। '/ Za' का उपयोग दुर्भाग्य से एक विकल्प नहीं है, क्योंकि यह कई अन्य चीजों को तोड़ता है। हमम ... –

+0

'/ Za' सी ++ मानक के माइक्रोसॉफ्ट एक्सटेंशन को अक्षम करने लगता है। https://msdn.microsoft.com/en-us/library/0k0w269d.aspx आपको यह तय करना होगा कि माइक्रोसॉफ़्ट एक्सटेंशन का उपयोग करना है या जीसीसी के साथ संकलित करना है ... – Melebius

+0

हां, दुर्भाग्यवश '/ Za' हमारे बहुत से मौजूदा कोड को तोड़ता है (कोड जो अन्य सभी कंपाइलरों के साथ ठीक संकलित करता है), इसलिए यह एक विकल्प नहीं है। यह विरासत कोड अड्डों के साथ बड़े सिरदर्दों में से एक है - आप चीजों को "ठीक" नहीं कर सकते हैं। –

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