如何摆脱`continue`混淆的编译器警告?

DBe*_*nko 4 delphi compiler-warnings delphi-xe2

编译器向我显示以下代码的以下警告:

Warning: W1036 Variable 'Address' might not have been initialized
Run Code Online (Sandbox Code Playgroud)

代码(基于实际代码的MVCE代码段):

function DoFoo(): Integer;
var
  i: Integer;
  Address, Bar: Cardinal;
begin
  for i := 1 to 5 do
  begin
    try
      Address := Hex2CardPos(IntToStr(i));
    except on EConvertError do
      continue;
    end;
    Bar := Address + 42;  // "Warning: Address might not have been initialized"
  end;
  Result := 42;
end;
Run Code Online (Sandbox Code Playgroud)

如您所见,Address是:

  1. 分配给结果 Hex2CardPos()
  2. Hex2CardPos() 抛出错误并立即跳过循环迭代.

我试图通过Address := 0;在循环开头添加一个无用的东西来解决这个问题,但是警告只是替换为另一个:

Hint: H2077 Value assigned to 'Address' never used.
Run Code Online (Sandbox Code Playgroud)

这是编译器错误还是警告有实质内容?

Agu*_*ert 8

问题出在您的代码中."Bar"赋值必须在try except块中,因为当异常发生时你不想分配"Bar"

function DoFoo(): Integer;
var
  i: Integer;
  Address, Bar: Cardinal;
begin
  for i := 1 to 5 do
  begin
    try
      Address := Hex2CardPos(IntToStr(i));
      Bar := Address + 42;
    except on EConvertError do
      continue;
    end;
  end;
  Result := 42;
end;
Run Code Online (Sandbox Code Playgroud)

顺便说一句,这段代码"H2077 Value assigned to 'Bar' never used"是正确的.

  • 仅仅因为您确定了使警告消失的代码排列并不意味着问题出现在代码中.编译器确实是错误的; 你已经确定了*解决方法*.编译器*应该能够在原始代码中识别出没有跳过`Address`赋值的`Bar`赋值的路径. (3认同)