How can I temporarily disable the “return value mi

2019-04-04 18:54发布

问题:

I want to disable a specific warning (W1035) in my code, since I think that the compiler is wrong about this warning:

function TfrmNagScreen.Run: TOption;
begin
  if ShowModal = mrOk then
    Result := TOption(rdgAction.EditValue)
  else
    Abort
end;

There is no way the result could be undefined, since Abort throws EAbort.

I tried:

  • {$WARN 1035 Off}: Apparently this only works for some specific errors (see Documentation)
  • {$W-1035}: Does nothing at all

I know I can switch off the warning globally in the project options, or using {$WARNINGS OFF}, but that is not what is intended here.

Edit: I have QC'ed this now as #89744.

回答1:

you can't disable this warning globally, but you can use the {$WARN NO_RETVAL OFF} to disable locally the warning.

{$WARN NO_RETVAL OFF}
function TfrmNagScreen.Run: TOption;
begin
  if ShowModal = mrOk then
    Result := TOption(rdgAction.EditValue)
  else
    Abort
end;
{$WARN NO_RETVAL ON}


回答2:

I don't have a Delphi compiler available at the moment, but rearranging the code to remove the if..else might make the warning go away:

function TfrmNagScreen.Run: TOption;
begin
  if ShowModal <> mrOk then
    Abort;

  Result := TOption(rdgAction.EditValue);
end;

See also How to disable a warning in Delphi about “return value … might be undefined”?.



回答3:

You can use a neat trick to fool the compiler. Define a library function as so:

procedure Abort(var X);
begin
  SysUtils.Abort;
end;

You can then write your function as:

if ShowModal = mrOk then
  Result := TOption(rdgAction.EditValue)
else
  Abort(Result)

The compiler thinks you've written to Result since it's a var parameter and it stops bleating.