私は次の単純なC++コードを持っています:
#include "stdafx.h"
int main()
{
int a = -10;
unsigned int b = 10;
// Trivial error is placed here on purpose to trigger a warning.
if( a < b ) {
printf( "Error in line above: this will not be printed\n" );
}
return 0;
}
Visual Studio 2010(デフォルトのC ++コンソールアプリケーション)を使用してコンパイルするとwarning C4018: '<' : signed/unsigned mismatch" on line 7
、期待どおりに表示されます(コードに論理エラーがあります)。
unsigned int b = 10;
しかし、私がconst unsigned int b = 10;
警告に変わると消えます!そのような行動の既知の理由はどこにありますか?gcc
に関係なく警告を表示しconst
ます。
アップデート
コメントから、多くの人が「どういうわけか最適化されているので、警告は必要ない」と提案していることがわかります。残念ながら、私のコードサンプルには警告をトリガーするために注意深く配置された実際の論理エラーがあるため、警告がprint
必要です。ステートメントは、実際には。未満であるにもかかわらず呼び出されません。このエラーはよく知られており、このようなエラーを見つけるために「符号付き/符号なし警告」が正確に発生します。-10
10
アップデート
また、コメントから、多くの人が私のコードで符号付き/符号なしの論理エラーを「発見」し、それを説明していることがわかります。そうする必要がない場合-このエラーは純粋に警告をトリガーするために配置され、些細なことであり(それ-10
はそう(unsigned int)-10
です0xFFFFFFFF-10
)、質問はそれについてではありません:)。