在编译匿名函数的本地函数时,(显然)虚假警告的原因是什么,以及如何消除它们。
一个简单的函数编译清洁 - 没有警告。如果该函数是另一个函数的局部函数,则再次没有警告。如果该函数是匿名函数的本地函数,则会产生以下警告:
[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.
答案 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中仍存在此错误,否则报告错误可能毫无意义。
有人可能怀疑编译器被本地函数混淆,本地函数是匿名方法的本地函数,永远不会被调用