2013-03-02 6 views
6

कोड का निम्न भाग दोनों जीसीसी और बजना पर चेतावनियाँ भी सृजित:कॉन्स द्वारा अवरुद्ध tautological तुलनाओं के बारे में चेतावनी?

int main() { 
    unsigned n = 0; 
    return (n < 0) ? 1 : 0; 
} 

चेतावनी है:

$ g++-4.7 -std=c++11 -O3 -Wall -Wextra t.cc -o t 
t.cc: In function ‘int main()’: 
t.cc:3:16: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits] 
$ clang++-3.2 -std=c++11 -O3 -Wall -Wextra t.cc -o t 
t.cc:3:14: warning: comparison of unsigned expression < 0 is always false [-Wtautological-compare] 
    return (n < 0) ? 1 : 0; 
      ~^~ 
1 warning generated. 
$ 

अब तक तो अच्छा। अब मैं बदल चर const होने के लिए:

int main() { 
    const unsigned n = 0; 
    return (n < 0) ? 1 : 0; 
} 

और दोनों compilers अचानक बिना किसी चेतावनी के कोड को संकलित करने के लिए खुश हैं:

$ g++-4.7 -std=c++11 -O3 -Wall -Wextra t.cc -o t 
$ clang++-3.2 -std=c++11 -O3 -Wall -Wextra t.cc -o t 
$ 

प्रश्न: ऐसा क्यों होता है? क्या कारण है, क्यों const चर चेतावनी दबाते हैं? यदि दोनों जीसीसी और बजना सहमत हूँ, मैं सिर्फ उन्हें एक बग रिपोर्ट फेंक करने में संकोच के रूप में यह अधिक संभावना है कि मैं सीखने की जरूरत है कुछ :)

संपादित करें: संकलक की लगातार तह से कोई लेना देना हो सकता है यह, लेकिन यह व्यवहार व्यवहार को समझाने के लिए पर्याप्त नहीं है। पहले उदाहरण में (const के बिना), कंपाइलर मान जानता है और यह कभी भी नहीं बदलता है। मैं कोडांतरक उत्पादन की जाँच की और संकलक निरंतर तह क्या करता है लेकिन यह अभी भी चेतावनी, शायद से पहले यह ज्ञात निरंतर द्वारा चर बदल देता है जब यह अभिव्यक्ति (n < 0) देखता है और जानते हुए भी कि n एक अहस्ताक्षरित प्रकार है उत्पन्न करता है। उस ने कहा: जब मैं const जोड़ता हूं तो यह व्यवहार क्यों बदलता है? मुझे लगता है कि अगर पहला उदाहरण चेतावनी उत्पन्न करता है, तो दूसरे के लिए चेतावनी उत्पन्न करना भी संभव होना चाहिए।

+1

यह संकलक अनुकूलन का सिर्फ एक दुष्प्रभाव है। – Mysticial

+0

'-O0' के साथ भी होता है। –

+0

कोई फर्क नहीं पड़ता। अनुकूलन के बिना भी कुछ अनुकूलन लागू होते हैं। इस मामले में, संकलक सचमुच उन सभी स्थानों पर निरंतर प्रतिलिपि/चिपका रहा है जो इसका उपयोग किया जाता है। – Mysticial

उत्तर

2

जब चर const नहीं है, तो यह बदल सकता है, संकलक इसे नहीं जानता है। यही कारण है कि एक चेतावनी है। यदि यह const है, तो यह कभी नहीं बदलेगा।

return (0 < 0) ? 1 : 0; 
-> return 0; 

इसलिए, कोई चेतावनी: इस तरह, संकलक n के किसी भी घटना n के वास्तविक मूल्य के साथ, इस मामले में बदल सकते हैं।

3

यह एक स्पष्ट स्थिर है - आपका इरादा

warning: comparison of unsigned expression < 0 is always false [-Wtautological-compare] 
return (n < 0) ? 1 : 0; 
     ~^~ 

-Wunreachable-code जब const करने के लिए:: अपने वांछित चेतावनी प्रभावी ढंग से स्थानांतरित कर रहा है

warning: will never be executed [-Wunreachable-code] 
return (n < 0) ? 1 : 0; 
       ^

नोट: -Wtautological-compare चेतावनी अभी भी संकलक जहां मूल्यों नहीं जाना जाता है के द्वारा उत्सर्जित किया जा सकता है।

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

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