代码之家  ›  专栏  ›  技术社区  ›  Jens Mühlenhoff

如何临时禁用“返回值可能未定义”警告?

  •  12
  • Jens Mühlenhoff  · 技术社区  · 15 年前

    我想在我的代码中禁用一个特定的警告(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 .

    3 回复  |  直到 15 年前
        1
  •  13
  •   RRUZ    15 年前

    不能全局禁用此警告,但可以使用 {$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}
    
        2
  •  9
  •   Community Mohan Dere    9 年前

    我现在没有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”? .

        3
  •  1
  •   David Heffernan    15 年前

    您可以使用一个巧妙的技巧来愚弄编译器。将库函数定义为:

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

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

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

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

    推荐文章