匿名函数的本地函数中的警告

时间:2015-07-25 16:56:29

标签: function delphi compiler-warnings delphi-xe

在编译匿名函数的本地函数时,(显然)虚假警告的原因是什么,以及如何消除它们。

一个简单的函数编译清洁 - 没有警告。如果该函数是另一个函数的局部函数,则再次没有警告。如果该函数是匿名函数的本地函数,则会产生以下警告:

[DCC Warning] Unit1.pas(57): W1036 Variable 'i' might not have been initialized
[DCC Warning] Unit1.pas(58): W1035 Return value of function 'StrToJType' might be undefined

示例代码如下所示。请注意,虽然此代码编译,但它会提供与此问题无关的警告,因为它不完整。

修改 注释和响应表明,示例代码在匿名函数中不包含返回值这一事实可能是问题的原因。此编辑修改代码以解决此问题,简化本地功能案例,并最小化代码。问题仍然存在。

unit Unit1;

interface

type
  JType = (JAtLeastOnce, JConditionLine, JInfix, JIteration, JNonNullInfix );
  TFuncTest = reference to function : JType;
  function StrToJType(aString : string) : JType;

implementation

function StrToJType(aString : string) : JType;
// Basic function - does not give warnings
var
  i : integer;
begin
  i := Pos(aString, '+i*-?');
  if i <> 0 then result := JType(i - 1) else result := High(JType);
end;

function Test : JType;
// Local function - does not give warnings
  function StrToJType(aString : string) : JType;
  var
    i : integer;
  begin
    i := Pos(aString, '+i*-?');
    if i <> 0 then result := JType(i - 1) else result := High(JType);
  end;
begin
  result := low(JType);
end;

function Test2 : TFuncTest;
// Local function of anonymous function - gives warnings
begin
  result :=
    function : JType
      function StrToJType(aString : string) : JType;
      var
        i : integer;
      begin
        i := Pos(aString, '+i*-?');
        if i <> 0 then result := JType(i - 1) else result := High(JType);
      end;
    begin
      result := Low(JType);
    end;
end;

end.

1 个答案:

答案 0 :(得分:0)

您的匿名函数未指定其返回值。

function Test2 : TFuncTest;
// Local function of anonymous function - gives warnings
begin
  result :=
    function : JStructureType
      function StrToJType(aString : string) : JStructureType;
      const
        c : string = '+i*-?p!qoxsc<^>8|';
      var
        i : integer;
      begin
        i := Pos(aString, c);
        if (aString <> '') and (i <> 0) then result := JStructureType(i - 1)
        else result := High(JStructureType);
      end;
    begin
      // need to return something here
    end;
end;

编译器也应该反对你在Test中犯同样的错误。

如果编译器在您修复了所有其他错误之后真的抱怨StrToJType,那么这将是一个编译器错误,应该提交给Quality Portal。

<强>更新

您的编辑确认当您解决其他错误时,本地功能中的警告仍然存在。所以这似乎是一个编译器错误。请进行最小限度的复制并提交。

当然德尔福XE未来不会更新。除非XE8中仍存在此错误,否则报告错误可能毫无意义。

有人可能怀疑编译器被本地函数混淆,本地函数是匿名方法的本地函数,永远不会被调用