【问题标题】:How can I temporarily disable the "return value might be undefined" warning?如何暂时禁用“返回值可能未定义”警告?
【发布时间】:2011-05-11 09:34:30
【问题描述】:

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

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

结果不可能是未定义的,因为Abort 会抛出EAbort

我试过了:

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

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

编辑:我现在已将其作为#89744 进行了QC。

【问题讨论】:

  • 虽然编译器有时会感到困惑并无缘无故地报告此警告,但在这种情况下,编译器在技术上是正确的。结果不在条件之前分配,仅在条件的真实分支上分配。如果条件为假,函数过早返回这一事实与编译器无关。
  • @codeelgance:非常正确,但我认为Abort 是一个内置函数,编译器可以识别这种情况。

标签: delphi delphi-2007 suppress-warnings compiler-directives


【解决方案1】:

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

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

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

另见How to disable a warning in Delphi about “return value … might be undefined”?

【讨论】:

  • +1 这行得通(针对特定情况),我没有想到,但它并不能解决一般问题。
【解决方案2】:

您不能全局禁用此警告,但您可以使用{$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}

【讨论】:

  • 你从哪里得到NO_RETVAL,因为它不在 Embarcadero 文档中?
  • 好的,所以大部分(全部?)警告文本都在DCCStrs.pas 中定义,很高兴知道:)
  • 在编辑单元时按 Ctrl-O-O,然后查看编辑器窗口的顶部。 :-)
【解决方案3】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-28
    • 2011-12-30
    • 1970-01-01
    • 2013-04-22
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多