このコードを書いてコンパイルすると/W4
long r;
__try { r = 0; }
__finally { }
return r;
私は得る:
warning C4701: potentially uninitialized local variable 'r' used
なぜこれが起こるのですか?
このコードを書いてコンパイルすると/W4
long r;
__try { r = 0; }
__finally { }
return r;
私は得る:
warning C4701: potentially uninitialized local variable 'r' used
なぜこれが起こるのですか?
コンパイラは、try ブロック内のコードが正常に実行されるかどうかを確認できません。この場合は常に実行されますが、try ブロックに追加のコードがある場合、r = 0 は実行されない可能性があります。その場合、r は初期化されていないため、エラーが発生します。
あなたが言ったのと同じです:
long r;
if(something) {
r = 0;
}
return r;
(「何か」は、一定の真の値以外のほとんどすべてです)。
単なるコメントよりも興味深いので、これを回答として追加します。変数の前にlabeled-statement : が挿入されるまで、エラーは発生しませんでした。関連するラベルを削除するgoto
と、警告は表示されません。これは、ブロックの挿入前に行番号で生成された同様の警告C4702でネームスペース パスがどのように設定されているかに関係している可能性があります。誰かが興味を持っている場合は、MVCE がまだ生成されていません。goto
long r;
作成しますr
が、初期化されていないためです。それはヌルです。
そのため、変数が初期化されていないことが警告されます。場合によっては、Null ポインターが発生します。