H2077 '%s' に代入された値は使用されていません (Delphi)
エラーと警告のメッセージ(Delphi) への移動
コンパイラは変数へ代入した値が使用されていない場合にこのヒントメッセージを表示します。最適化が使用可能に設定されている場合,その代入は削除されます。
その変数をどこにも使用していなかったり使用する前に再代入していると,このメッセージが表示される場合があります。
program Produce; (*$HINTS ON*) procedure Simple; var I: Integer; begin I := 42; (*<-- ここでヒントメッセージ*) end; procedure Propagate; var I: Integer; K: Integer; begin I := 0; (*<-- ここでヒントメッセージ*) Inc(I); (*<-- ここでヒントメッセージ*) K := 42; while K > 0 do begin if Odd(K) then Inc(I); (*<-- ここでヒントメッセージ*) Dec(K); end; end; procedure TryFinally; var I: Integer; begin I := 0; (*<-- ここでヒントメッセージ*) try I := 42; finally Writeln('Reached finally'); end; Writeln(I); (*Will always write 42 - if an exception happened, we wouldn't get here*) end; begin end.
{ 手続き Propagate の中でコンパイラは変数 I が while ループの後で使用されていないので,I を while 内でインクリメントする必要はないと認識し,したがってそのインクリメントと while ループの前の代入も不必要であると認識する }
{手続き TryFinally では try..finally 構造の前にある I への代入は必要ない。例外が発生した場合,最後の Writeln 文は実行されないので I の値は意味がない。例外が発生しなかった場合,Writeln 文で表示される I の値は常に 42 である。したがって最初の代入はこの手続きの動作を変更しないので削除できる }
{ このヒントメッセージはプログラムの誤りを示しているのではなく,単に不要な代入があるというコンパイラの判断を意味している }
{ 通常はその代入を単に削除でき,削除しなくても最適化をオンにしてコンパイルするとコンパイル後のコードには組み込まれない }
{ ただし,誤った変数へ代入した場合,たとえば J へ代入するつもりで I へ代入した場合などには問題が発生することがあります。したがって,問題のありそうな代入は注意深く調べる価値がある }