12

我想在我的代码中禁用特定警告(W1035),因为我认为编译器对此警告有误:

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

结果不可能是未定义的,因为Abortthrows EAbort

我试过了:

  • {$WARN 1035 Off}:显然这仅适用于某些特定错误(请参阅文档
  • {$W-1035}: 什么都不做

我知道我可以在项目选项中全局关闭警告,或者使用{$WARNINGS OFF},但这不是这里的意图。

编辑:我现在已将其 QC 为#89744

4

3 回答 3

13

您不能全局禁用此警告,但可以使用{$WARN NO_RETVAL OFF}本地禁用警告。

{$WARN NO_RETVAL OFF}
function TfrmNagScreen.Run: TOption;
begin
  if ShowModal = mrOk then
    Result := TOption(rdgAction.EditValue)
  else
    Abort
end;
{$WARN NO_RETVAL ON}
于 2010-11-17T13:10:58.867 回答
9

我目前没有可用的 Delphi 编译器,但重新排列代码以删除if..else可能会使警告消失:

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

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

另请参阅如何在 Delphi 中禁用有关“返回值……可能未定义”的警告?.

于 2010-11-17T13:06:21.770 回答
1

您可以使用巧妙的技巧来欺骗编译器。像这样定义一个库函数:

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

然后,您可以将函数编写为:

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

编译器认为您已经写入 Result,因为它是一个 var 参数并且它停止了咩咩声。

于 2010-11-17T20:28:06.083 回答