10.2東京にアップグレードした後、サードパーティのコンポーネントの1つでは、多くの例外がスローされ始めました。 (デフォルトリリース構成)H2077の中で最後にgotoでブロックしよう - 東京のコンパイラの欠陥ですか?
function foo(i: Integer): Boolean;
label bar;
begin
try
if i=1 then goto bar;
Result:=False;
EXIT;
bar:
Result:=True; //<~~ H2077 Value assigned to 'foo' never used with Optimization on
finally
end;
end;
- Trueに設定コンパイラオプションで最適化付:デバッグは、この(うまくいけば)最小限のコードで表すことができるコードの問題の一部を示しました -
foo(1)
が返されますFalse
- False(デフォルトはの場合、デバッグ設定)
foo(1)
はを返します。
このような問題はXE7では発生しません。 This answer東京のコンパイラの変更点はおそらく関連しているかもしれませんが、新しく導入された問題のいくつかを修正する可能性があります。
私の質問は ですそれは東京のコンパイラの欠陥ですか?私はかなり確信していますが、私はDelphiでプログラミングするのが初めてで、経験豊富なユーザーからの確認を得るのは素晴らしいことです。
コンパイラの欠陥の場合は、私はフォローアップの質問があります:このコードを修正するための迅速な方法はありますか?私はシンプルなif then else
文で私のMCVEでgoto
を削除する方法を知っているが、実際のコードは、方法より複雑です:
if cond1 then goto bar;
if cond2 then goto bar;
if cond3 then goto bar;
...
if condN then goto bar;
そしてif
ブロックのいくつかはまた、内側goto
でループを含んでいます。私はこのロジックをすべてif then else
ブロックの入れ子に書き換える方法を知っていますが、コンパイラの欠陥やサードパーティのコンポーネントが修正されるのを待たずに簡単に修正できる方法があります。
私はもう一度gotoを使っている人を見たので、20年以上経ちました。私は最終的にそれを取り除いたと思った... – GuidoG