【发布时间】:2012-07-18 06:49:39
【问题描述】:
我收到一个我不明白的编译器警告:
procedure Test;
var
Var1: Integer;
begin
while True do
begin
try
if System.Random > 0.5 then
begin
ShowMessage('Skipping');
continue; // If I remove this line, the warning goes away
end;
Var1:=6;
except on
E:Exception do
begin
ShowMessage('Error');
raise;
end;
end;
ShowMessage(IntToStr(Var1)); // Compiler warning on this line
end;
end;
当我在 Delphi 2010 中编译它时,我得到:
[DCC 警告] OnlineClaimManagerMainU.pas(554): W1036 变量 'Var1' 可能还没有初始化
如果我删除对“继续”的调用,警告就会消失。
另外,如果我删除 try/except 子句(并离开 continue),警告就会消失。
在没有初始化 Var1 的情况下,如何执行到有问题的行?
【问题讨论】:
-
编译器的分析没有你那么深。不能确定 Var1 是否已初始化。你知道 Var1 总是被初始化,但编译器没有你的分析能力。
-
那么...为什么删除 continue 会修复它?同样的问题也适用。还是仅仅是两者结合的复杂性让编译器大吃一惊?
-
添加 Var1:=0;之前让编译器高兴。
-
我猜 continue 的存在意味着编译器的分析更加困难。有趣的是,我曾经有一些我知道很好但编译器警告过的代码,在 x86 中而不是 x64 中。我做了明显的改变,然后 x86 编译器安静了,但是 x64 编译器抱怨!很奇怪。
-
@cesar 没有抓住重点。问题是为什么编译器会警告永远不会发生的事情。
标签: delphi delphi-2010