कोड का निम्न भाग दोनों जीसीसी और बजना पर चेतावनियाँ भी सृजित:कॉन्स द्वारा अवरुद्ध 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
जोड़ता हूं तो यह व्यवहार क्यों बदलता है? मुझे लगता है कि अगर पहला उदाहरण चेतावनी उत्पन्न करता है, तो दूसरे के लिए चेतावनी उत्पन्न करना भी संभव होना चाहिए।
यह संकलक अनुकूलन का सिर्फ एक दुष्प्रभाव है। – Mysticial
'-O0' के साथ भी होता है। –
कोई फर्क नहीं पड़ता। अनुकूलन के बिना भी कुछ अनुकूलन लागू होते हैं। इस मामले में, संकलक सचमुच उन सभी स्थानों पर निरंतर प्रतिलिपि/चिपका रहा है जो इसका उपयोग किया जाता है। – Mysticial